QVTKWidget
和 QVTKOpenGLNativeWidget
是 Qt 与 VTK(Visualization Toolkit)结合时用来显示 3D 可视化图形的 Qt 小部件(widget)。这两个类使得开发者能够将 VTK 的图形渲染与 Qt 应用程序集成,常用于医学影像、科学可视化等领域,支持在 Qt 应用中展示复杂的 3D 数据,而本教材Qt+PCL联合开发可视化就是基于Qt与VTK结合生成的QVTKWidget
/ QVTKOpenGLNativeWidget
部件来进行的, Qt与VTK编译生成QVTKWidget
和QVTKOpenGLNativeWidget
可参考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
,并在其中渲染了一个立方体。通过 vtkRenderer
和 vtkActor
来控制 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 的主要区别
-
渲染机制:
QVTKWidget
使用 Qt 自带的渲染机制,适用于传统的 Qt Widgets 应用程序。QVTKOpenGLNativeWidget
使用 OpenGL 渲染机制,更加灵活且高效,适用于需要对 OpenGL 状态有更高控制的应用。
-
性能与灵活性:
QVTKOpenGLNativeWidget
提供了更低级别的控制,适用于需要高效的 3D 渲染和性能优化的场景。QVTKWidget
更适合传统的 Qt Widgets 应用程序,不需要过多底层渲染控制的场景。
-
兼容性:
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. 结果展示
五、总结
- QVTKWidget 和 QVTKOpenGLNativeWidget 都是 Qt 与 VTK 集成时用于显示 VTK 渲染结果的 Qt 小部件。
QVTKWidget
更适合传统的 Qt Widgets 应用程序,而QVTKOpenGLNativeWidget
提供了更灵活的 OpenGL 渲染控制,适用于高性能需求的应用。 - 使用这两个类,可以轻松地将 VTK 的图形渲染与 Qt 的图形界面结合起来,进行 3D 可视化和科学数据处理,大家可以根据自己的需求选择两个部件。
至此完成第8讲的相关内容,欢迎喜欢的朋友订阅