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讲的相关内容,欢迎喜欢的朋友订阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值