Qt+PCL手把手教材(第8讲)——QVTKWidget/QVTKOpenGLNativeWidget 部件介绍和基础应用示例

QVTKWidgetQVTKOpenGLNativeWidget 是 Qt 与 VTK(Visualization Toolkit)结合时用来显示 3D 可视化图形的 Qt 小部件(widget)。这两个类使得开发者能够将 VTK 的图形渲染与 Qt 应用程序集成,常用于医学影像、科学可视化等领域,支持在 Qt 应用中展示复杂的 3D 数据,而本教材Qt+PCL联合开发可视化就是基于Qt与VTK结合生成的QVTKWidget / QVTKOpenGLNativeWidget部件来进行的, Qt与VTK编译生成QVTKWidgetQVTKOpenGLNativeWidget可参考Qt+PCL手把手教材(第4讲)——Win11环境(VTK9.1.0+Qt5.15.2)编译QVTK组件

一、VTK 简介

VTK(Visualization Toolkit)是一个用于 3D 图形、图像处理和科学可视化的开源软件库。它提供了大量的工具和算法来处理大规模数据集,并渲染 3D 可视化效果。

  • VTK 主要使用 OpenGL 作为渲染后端,因此可以通过 OpenGL 在 Qt 中实现高效的 3D 渲染。
  • VTK 提供了图形渲染、数据可视化、几何建模、图像处理等功能。

二、QVTKWidget 和 QVTKOpenGLNativeWidget

这两个类都是 Qt 与 VTK 集成时用于显示 VTK 渲染结果的 Qt 小部件。它们的作用是为 VTK 提供一个显示区域,在 Qt 应用中显示 3D 图形。

1. QVTKWidget

QVTKWidget 是一个基于 Qt 的小部件,允许在 Qt 窗口中嵌入 VTK 渲染窗口。它使用了 Qt 的渲染机制来显示 VTK 渲染的内容。此类通常用于传统的基于 Qt Widgets 的应用程序中。

  • 继承关系
    QVTKWidget 继承自 Qt 的 QWidget 类,允许你像使用任何 Qt 小部件一样使用它。
  • 使用场景
    • QVTKWidget 用于基于传统 Qt Widgets 的图形界面应用中。
    • 支持与 Qt 的其他控件(如按钮、标签等)交互。
示例代码:
#include <QVTKWidget.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindowInteractor.h>

class MyVTKWidget : public QMainWindow {
    Q_OBJECT
public:
    MyVTKWidget(QWidget *parent = nullptr) : QMainWindow(parent) {
        vtkWidget = new QVTKWidget(this);
        setCentralWidget(vtkWidget);

        // Create VTK Renderer
        renderer = vtkSmartPointer<vtkRenderer>::New();
        vtkWidget->GetRenderWindow()->AddRenderer(renderer);

        // Create VTK Cube Source
        cube = vtkSmartPointer<vtkCubeSource>::New();
        mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputConnection(cube->GetOutputPort());
        
        actor = vtkSmartPointer<vtkActor>::New();
        actor->SetMapper(mapper);
        
        renderer->AddActor(actor);
        renderer->SetBackground(0.1, 0.1, 0.1); // Background color
    }

private:
    QVTKWidget *vtkWidget;
    vtkSmartPointer<vtkRenderer> renderer;
    vtkSmartPointer<vtkCubeSource> cube;
    vtkSmartPointer<vtkPolyDataMapper> mapper;
    vtkSmartPointer<vtkActor> actor;
};

在上面的示例中,创建了一个 QVTKWidget,并在其中渲染了一个立方体。通过 vtkRenderervtkActor 来控制 3D 对象的渲染。

2. QVTKOpenGLNativeWidget

QVTKOpenGLNativeWidget 也是用于在 Qt 中显示 VTK 渲染的窗口,但它与 QVTKWidget 的主要区别是,它允许直接使用 VTK 渲染窗口,并且通常不涉及 Qt 渲染机制,适用于需要更直接控制渲染的场景,尤其是当你想要更高效地控制 OpenGL 渲染时。

  • 继承关系
    QVTKOpenGLNativeWidget 继承自 QOpenGLWidget,因此它与 Qt 的 OpenGL 渲染机制更加紧密集成。
  • 使用场景
    • QVTKOpenGLNativeWidget 适用于需要更底层渲染控制和更高性能的应用,通常用于 Qt 6 或较新的 OpenGL 渲染环境。
    • 它允许你更灵活地控制 OpenGL 状态,适用于高性能的 3D 可视化应用。
示例代码:
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

class MyVTKOpenGLWidget : public QMainWindow {
    Q_OBJECT
public:
    MyVTKOpenGLWidget(QWidget *parent = nullptr) : QMainWindow(parent) {
        vtkWidget = new QVTKOpenGLNativeWidget(this);
        setCentralWidget(vtkWidget);

        // Create VTK Renderer
        renderer = vtkSmartPointer<vtkRenderer>::New();
        vtkWidget->GetRenderWindow()->AddRenderer(renderer);

        // Create VTK Cube Source
        cube = vtkSmartPointer<vtkCubeSource>::New();
        mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
        mapper->SetInputConnection(cube->GetOutputPort());
        
        actor = vtkSmartPointer<vtkActor>::New();
        actor->SetMapper(mapper);
        
        renderer->AddActor(actor);
        renderer->SetBackground(0.1, 0.1, 0.1); // Background color
    }

private:
    QVTKOpenGLNativeWidget *vtkWidget;
    vtkSmartPointer<vtkRenderer> renderer;
    vtkSmartPointer<vtkCubeSource> cube;
    vtkSmartPointer<vtkPolyDataMapper> mapper;
    vtkSmartPointer<vtkActor> actor;
};

在这个示例中,我们使用了 QVTKOpenGLNativeWidget 来创建一个类似的渲染环境,渲染了一个立方体,适合需要 OpenGL 渲染优化的应用。

三、QVTKWidget 与 QVTKOpenGLNativeWidget 的主要区别

  1. 渲染机制

    • QVTKWidget 使用 Qt 自带的渲染机制,适用于传统的 Qt Widgets 应用程序。
    • QVTKOpenGLNativeWidget 使用 OpenGL 渲染机制,更加灵活且高效,适用于需要对 OpenGL 状态有更高控制的应用。
  2. 性能与灵活性

    • QVTKOpenGLNativeWidget 提供了更低级别的控制,适用于需要高效的 3D 渲染和性能优化的场景。
    • QVTKWidget 更适合传统的 Qt Widgets 应用程序,不需要过多底层渲染控制的场景。
  3. 兼容性

    • QVTKWidget 适用于 Qt 5 和以前的版本。
    • QVTKOpenGLNativeWidget 更适合 Qt 6 和支持 OpenGL 渲染的环境。

四、QVTKOpenGLNativeWidget 部件综合示例

一个结合 Qt 和 VTK的完整示例,演示如何在 Qt 界面中嵌入 VTK 渲染窗口,并绘制一个 3D 球体。

1. 项目结构
/QtVtkSphere
  ├── main.cpp
  ├── mainwindow.h
  ├── mainwindow.cpp
  ├── CMakeLists.txt

2. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

// VTK 相关头文件
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSmartPointer.h>

class vtkRenderer;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

private:
// VTK 渲染控件
    QVTKOpenGLNativeWidget* vtkWidget;
    vtkSmartPointer<vtkRenderer> renderer;
};

#endif // MAINWINDOW_H


3. mainwindow.cpp
#include "mainwindow.h"

#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    // 创建 Qt-VTK 渲染控件
    vtkWidget = new QVTKOpenGLNativeWidget(this);
    setCentralWidget(vtkWidget);

    // 创建球体源
    vtkSmartPointer<vtkSphereSource> sphereSource =
        vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetCenter(0, 0, 0);
    sphereSource->SetRadius(5.0);
    sphereSource->SetThetaResolution(50);
    sphereSource->SetPhiResolution(50);
    sphereSource->Update();

    // 映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(sphereSource->GetOutputPort());

    // 动作
    vtkSmartPointer<vtkActor> actor =
        vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(1.0, 0.5, 0.3); // 橙色

    // 渲染器
    renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.4);

    // 绑定渲染器到 Qt VTK 控件
    vtkWidget->renderWindow()->AddRenderer(renderer);


    // 设置交互器和交互样式(鼠标控制旋转、缩放)
    //vtkSmartPointer<vtkRenderWindowInteractor> interactor =
    //    vtkWidget->renderWindow()->GetInteractor();
    //vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
    //    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    //interactor->SetInteractorStyle(style);


    // 渲染一次
    vtkWidget->renderWindow()->Render();
}

MainWindow::~MainWindow() = default;


4. main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.resize(800, 600);
    w.show();

    return a.exec();
}
5. 结果展示

在这里插入图片描述

五、总结

  • QVTKWidgetQVTKOpenGLNativeWidget 都是 Qt 与 VTK 集成时用于显示 VTK 渲染结果的 Qt 小部件。QVTKWidget 更适合传统的 Qt Widgets 应用程序,而 QVTKOpenGLNativeWidget 提供了更灵活的 OpenGL 渲染控制,适用于高性能需求的应用。
  • 使用这两个类,可以轻松地将 VTK 的图形渲染与 Qt 的图形界面结合起来,进行 3D 可视化和科学数据处理,大家可以根据自己的需求选择两个部件。

至此完成第8讲的相关内容,欢迎喜欢的朋友订阅

<think>我们正在处理一个关于在Qt项目中集成PCL库的问题。根据引用内容,我们知道PCL通常与VTK一起使用,因为VTK提供了强大的可视化能力,而Qt提供了GUI框架。因此,集成PCL通常也意味着需要集成VTK,并在Qt中使用一个能够显示VTK渲染的部件(如QVTKOpenGLNativeWidget)。 根据引用[1][2],我们知道在Qt中集成PCLVTK可以实现数据可视化。引用[3]特别提到了QVTKWidgetQVTKOpenGLNativeWidget这两个部件,它们是QtVTK结合的桥梁。引用[4]则提供了配置开发环境(VS2019+QT5.14.2+VTK9.1.0)的一些注意事项。 因此,配置Qt项目使用PCL库的步骤大致如下: 1. 环境准备:安装必要的软件库,包括QtPCLVTK,并确保它们版本兼容(如引用[2]中提到的PCL1.12、VTK9.1Qt6,但用户可能使用其他版本,需注意版本匹配)。 2. 编译VTK以生成QVTKOpenGLNativeWidget(或QVTKWidget,但新版本推荐使用QVTKOpenGLNativeWidget)组件。 3. 配置Qt项目文件(.pro文件)以包含PCLVTK的头文件库。 4. 在Qt应用程序中使用QVTKOpenGLNativeWidget来显示点云或其他3D数据。 下面我们详细说明每一步。 步骤1:环境准备 安装Qt(根据引用[4],如果使用Windows,安装Qt时需要勾选相应的编译器,如MSVC2017 64-bit)、PCLVTK。注意版本兼容性,例如: - PCL 1.12 需要 VTK 9.1 Qt 5.15 或 Qt 6(引用[2][3])。 - 确保安装的PCL库是使用与Qt相同的编译器编译的(例如,如果使用MSVC2017 64-bit编译Qt,那么PCL也应该用MSVC2017 64-bit编译)。 步骤2:编译VTK 引用[3]提到需要编译VTK以生成QVTK组件。具体步骤可以参考引用[3]中提到的“Qt+PCL手把手教材(第4)”。这里简要说明: - 下载VTK源代码(版本9.1.0)。 - 使用CMake配置VTK,需要设置以下关键选项: - `VTK_GROUP_ENABLE_Qt` 设置为 `YES` - `VTK_MODULE_ENABLE_VTK_GUISupportQt` 设置为 `YES` - `VTK_MODULE_ENABLE_VTK_RenderingQt` 设置为 `YES` - `VTK_MODULE_ENABLE_VTK_ViewsQt` 设置为 `YES` - 同时,确保指定Qt的安装路径(设置Qt5_DIR或Qt6_DIR为Qt安装目录下的lib/cmake/Qt5或Qt6目录)。 - 生成解决方案并编译安装。 步骤3:配置Qt项目 在Qt项目文件(.pro)中,添加PCLVTK的包含路径库文件。例如: ```qmake # 假设PCLVTK安装在标准路径,如果不是,请修改路径 # 设置包含路径 INCLUDEPATH += "C:/Program Files/PCL 1.12/include/pcl-1.12" \ "C:/Program Files/VTK/include/vtk-9.1" # 设置库路径 LIBS += -L"C:/Program Files/PCL 1.12/lib" \ -L"C:/Program Files/VTK/lib" # 添加必要的PCLVTK库(这里只列出部分,实际需要根据项目用到的模块添加) LIBS += -lpcl_common -lpcl_io -lpcl_visualization LIBS += -lvtkCommonCore-9.1 -lvtkFiltersSources-9.1 -lvtkRenderingCore-9.1 -lvtkRenderingOpenGL2-9.1 -lvtkInteractionStyle-9.1 -lvtkGUISupportQt-9.1 # 如果使用QVTKOpenGLNativeWidget,还需要链接VTKQt模块 LIBS += -lQVTKOpenGLNativeWidget-9.1 ``` 注意:在Windows上,库文件名通常不带`lib`前缀,且使用`.lib`扩展名。在Linux上,库文件名通常以`lib`开头,扩展名为`.so`或`.a`。 步骤4:在Qt应用程序中使用QVTKOpenGLNativeWidget - 在Qt的UI文件中,放置一个QWidget,然后将其提升为QVTKOpenGLNativeWidget(需要包含头文件`#include <QVTKOpenGLNativeWidget.h>`)。 - 或者在代码中创建QVTKOpenGLNativeWidget的实例。 示例代码: ```cpp #include <QVTKOpenGLNativeWidget.h> #include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> // 在窗口类中 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(this); vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkWidget->renderWindow()->AddRenderer(renderer); ``` 对于PCL点云显示,可以使用PCL的Visualizer,它内部使用VTK进行渲染。但注意,PCL的Visualizer需要与QVTKOpenGLNativeWidget结合。 示例(显示点云): ```cpp #include <pcl/visualization/pcl_visualizer.h> #include <QVTKOpenGLNativeWidget.h> // 在窗口类中 QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget(this); boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("viewer", false)); vtkWidget->setRenderWindow(viewer->getRenderWindow()); viewer->setupInteractor(vtkWidget->interactor(), vtkWidget->renderWindow()); // 添加点云 viewer->addPointCloud<pcl::PointXYZ>(cloud, "cloud"); // 刷新视图 viewer->resetCamera(); vtkWidget->renderWindow()->Render(); ``` 注意:PCLVisualizer使用boost::shared_ptr,并且需要确保在窗口关闭时正确释放资源。 此外,还需要注意: - 在Windows上,可能需要将PCLVTK的dll文件复制到可执行文件目录,或者将它们的bin目录添加到系统PATH环境变量中。 - 如果遇到OpenGL相关错误,检查显卡驱动,并确保系统支持OpenGL。 以上步骤提供了一个基本的配置指南。由于不同系统版本可能存在差异,具体问题需要具体分析。 最后,根据指令要求,生成相关问题: §§相关问题§§ 1. 如何解决在Qt中使用PCL时遇到的版本兼容性问题? 2. 在Qt中显示点云数据时出现渲染窗口不更新,应如何调试? 3. 除了点云PCL库在Qt中还能处理哪些类型的3D数据? 4. 如何在Qt中同时显示多个点云视图?</think>### Qt项目配置PCL库集成开发指南 在Qt中集成PCL库需要结合VTK进行可视化,以下是详细步骤: #### 一、环境准备 1. **编译器配置** 安装VS2019(或更高版本)并确保安装C++桌面开发组件[^4]。 2. **Qt安装** 安装Qt 5.15+(或Qt 6),勾选: - MSVC 2019 64-bit组件 - Qt Creator CDB Debugger - MinGW编译器(备用)[^4] 3. **库版本匹配** 推荐组合: ```plaintext PCL 1.12 + VTK 9.1 + Qt 5.15/6.x [^2] ``` #### 二、编译依赖库 1. **VTK编译** 关键CMake选项: ```cmake VTK_GROUP_ENABLE_Qt=YES VTK_MODULE_ENABLE_VTK_GUISupportQt=YES Module_vtkRenderingOpenGL2=ON BUILD_SHARED_LIBS=ON [^3] ``` 2. **PCL配置** 通过CMake指定: - `PCL_DIR`:指向PCL安装目录 - `VTK_DIR`:指向编译好的VTK目录 #### 三、Qt项目配置 在`.pro`文件中添加: ```qmake # PCL配置 INCLUDEPATH += "C:/PCL/include/pcl-1.12" LIBS += -L"C:/PCL/lib" -lpcl_common -lpcl_io # VTK配置 INCLUDEPATH += "C:/VTK/include/vtk-9.1" LIBS += -L"C:/VTK/lib" \ -lvtkRenderingOpenGL2-9.1 \ -lvtkGUISupportQt-9.1 [^3] ``` #### 四、核心代码实现 1. **初始化QVTK窗口** ```cpp #include <QVTKOpenGLNativeWidget.h> #include <pcl/visualization/pcl_visualizer.h> QVTKOpenGLNativeWidget *vtkWidget = new QVTKOpenGLNativeWidget; boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer( new pcl::visualization::PCLVisualizer("Point Cloud", false) ); vtkWidget->setRenderWindow(viewer->getRenderWindow()); [^3] ``` 2. **加载点云** ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("cloud.pcd", *cloud); viewer->addPointCloud(cloud, "sample_cloud"); viewer->resetCamera(); // 重置相机视角 ``` 3. **集成到Qt界面** ```cpp // 在mainwindow.cpp中 QHBoxLayout *layout = new QHBoxLayout(centralWidget()); layout->addWidget(vtkWidget); ``` #### 五、调试技巧 1. **常见问题解决**: - **OpenGL错误**:更新显卡驱动,确保支持OpenGL 4.0+ - **链接失败**:检查库路径是否包含空格(建议安装路径无空格) - **版本冲突**:所有库必须使用相同编译器构建(如MSVC2019 64-bit)[^2] 2. **环境变量配置**: 添加PATH: ```bat C:\PCL\bin; C:\VTK\bin; C:\Qt\5.15.2\msvc2019_64\bin ``` #### 六、进阶应用 1. **点云处理管道**: ```cpp pcl::PassThrough<pcl::PointXYZ> filter; filter.setInputCloud(cloud); filter.filter(*filteredCloud); viewer->updatePointCloud(filteredCloud, "filtered_cloud"); ``` 2. **多视图支持**: ```cpp viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 左视图 viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2); // 右视图 ``` [^1]: 在Qt中集成VTKPCL实现数据可视化的完整指南 [^2]: PCL1.12、VTK9.1与QT6的编译部署指南 [^3]: QVTKWidget/QVTKOpenGLNativeWidget部件应用示例 [^4]: VS2019+QT5.14.2+VTK9.1.0配置指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值