VTK-8.2.0+QT5.14.2展示3D图像

VTK HelloWorld 项目核心业务流程

项目代码

main.cpp

cpp 复制代码
#include <QApplication>
#include <QMainWindow>
// Now include VTKWidget
#include "vtkwidget.h"

#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)

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

    // Create main window
    QMainWindow mainWindow;
    mainWindow.setWindowTitle("VTK HelloWorld");
    mainWindow.resize(800, 600);

    // Create VTKWidget and add to main window
    VTKWidget *vtkWidget = new VTKWidget(&mainWindow);
    mainWindow.setCentralWidget(vtkWidget);

    // Show window
    mainWindow.show();

    return a.exec();
}

vtkwidget.h

cpp 复制代码
#ifndef VTKWIDGET_H
#define VTKWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

#include <QVTKOpenGLWidget.h>

class VTKWidget : public QWidget
{
    Q_OBJECT

public:
    explicit VTKWidget(QWidget *parent = nullptr);
    ~VTKWidget();

private:
    // Initialize VTK scene
    void initVTK();

    QVTKOpenGLWidget *m_pScene;
};

#endif // VTKWIDGET_H
cpp 复制代码
#include "vtkwidget.h"
#include <QVTKWidget.h>
#include <array>
#include <vtkNew.h>
#include <vtkNamedColors.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkGenericOpenGLRenderWindow.h>

VTKWidget::VTKWidget(QWidget *parent) : QWidget(parent)
{
    // Set layout first
    QVBoxLayout *layout = new QVBoxLayout(this);
    
    // Initialize VTK scene
    initVTK();
    
    // Add QVTKOpenGLWidget to layout
    layout->addWidget(m_pScene);
    setLayout(layout);
}

VTKWidget::~VTKWidget()
{
}

void VTKWidget::initVTK()
{
    m_pScene = new QVTKOpenGLWidget();

    vtkNew<vtkNamedColors> colors;

    // Set the background color.
    double bkg[3] = {0.1, 0.2, 0.4};
    colors->SetColor("BkgColor", bkg);

    // This creates a polygonal cylinder model with eight circumferential facets
    // (i.e, in practice an octagonal prism).
    vtkNew<vtkCylinderSource> cylinder;
    cylinder->SetResolution(8);

    // The mapper is responsible for pushing the geometry into the graphics
    // library. It may also do color mapping, if scalars or other attributes are
    // defined.
    vtkNew<vtkPolyDataMapper> cylinderMapper;
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

    // The actor is a grouping mechanism: besides the geometry (mapper), it
    // also has a property, transformation matrix, and/or texture map.
    // Here we set its color and rotate it around the X and Y axes.
    vtkNew<vtkActor> cylinderActor;
    cylinderActor->SetMapper(cylinderMapper);
    double tomatoColor[3] = {1.0, 0.39, 0.28};
    cylinderActor->GetProperty()->SetColor(tomatoColor);
    cylinderActor->RotateX(30.0);
    cylinderActor->RotateY(-45.0);

    // The renderer generates the image
    // which is then displayed on the render window.
    // It can be thought of as a scene to which the actor is added
    vtkNew<vtkRenderer> renderer;
    renderer->AddActor(cylinderActor);
    renderer->SetBackground(bkg);
    // Zoom in a little by accessing the camera and invoking its "Zoom" method.
    renderer->ResetCamera();
    renderer->GetActiveCamera()->Zoom(1.5);

    vtkSmartPointer<vtkGenericOpenGLRenderWindow> window = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    window->AddRenderer(renderer);

    m_pScene->SetRenderWindow(window);
}

背景

项目基于VTK+QT开发

VTK环境安装:VTK-8.2.0版本安装

项目概述

VTK HelloWorld 是一个基于 Qt5 和 VTK 8.2.0 的简单 3D 可视化程序,用于展示如何在 Qt 应用程序中集成 VTK 进行 3D 渲染。

核心业务流程

1. 程序启动流程

启动程序
创建 QApplication
初始化 VTK 模块
创建 QMainWindow
创建 VTKWidget
初始化 VTK 场景
显示主窗口
进入事件循环

2. VTK 场景初始化流程

VTKWidget 构造函数
创建布局
调用 initVTK
创建 QVTKOpenGLWidget
创建 vtkNamedColors
创建 vtkCylinderSource
创建 vtkPolyDataMapper
创建 vtkActor
设置 Actor 属性
创建 vtkRenderer
添加 Actor 到 Renderer
设置背景颜色
重置相机
创建 vtkGenericOpenGLRenderWindow
添加 Renderer 到 RenderWindow
设置 QVTKOpenGLWidget 的 RenderWindow
添加 QVTKOpenGLWidget 到布局

组件关系

1. 类层次结构

QApplication
QMainWindow
VTKWidget
QVTKOpenGLWidget
vtkGenericOpenGLRenderWindow
vtkRenderer
vtkActor
vtkPolyDataMapper
vtkCylinderSource

2. 核心组件职责

组件 职责 来源
QApplication 应用程序主对象,管理事件循环 Qt5
QMainWindow 主窗口容器,提供用户界面框架 Qt5
VTKWidget 自定义 Widget,集成 VTK 渲染 自定义
QVTKOpenGLWidget VTK 与 Qt 的桥接组件,显示渲染结果 VTK
vtkGenericOpenGLRenderWindow VTK 渲染窗口,管理渲染过程 VTK
vtkRenderer 渲染器,管理场景中的对象 VTK
vtkActor 场景中的可视化对象 VTK
vtkPolyDataMapper 数据映射器,将数据转换为可视化表示 VTK
vtkCylinderSource 圆柱体数据源,生成圆柱体几何数据 VTK
vtkNamedColors 颜色管理工具,提供预定义颜色 VTK

技术栈

技术 版本 用途
Qt 5.14.2 图形用户界面框架
VTK 8.2.0 3D 可视化库
C++ C++11 编程语言
qmake Qt 自带 构建工具

关键技术点

  1. VTK 模块初始化 :使用 VTK_MODULE_INIT 宏初始化必要的 VTK 模块,确保渲染功能正常工作。

  2. Qt 与 VTK 集成 :使用 QVTKOpenGLWidget 作为 VTK 渲染窗口的容器,实现 VTK 渲染结果在 Qt 界面中的显示。

  3. 3D 场景构建:通过创建数据源、映射器、Actor 和渲染器,构建完整的 3D 渲染场景。

  4. 内存管理 :使用 VTK 的智能指针 vtkSmartPointervtkNew 管理 VTK 对象的生命周期,避免内存泄漏。

  5. 初始化顺序:确保 QApplication 在任何 QWidget 创建之前创建,避免 "QWidget: Must construct a QApplication before a QWidget" 错误。

运行环境要求

  1. Qt 5.14.2 或更高版本
  2. VTK 8.2.0 或兼容版本
  3. C++ 编译器:MSVC 2017 或兼容编译器
  4. 操作系统:Windows 7 或更高版本

常见问题及解决方案

  1. QWidget: Must construct a QApplication before a QWidget:确保 QApplication 在任何 QWidget 创建之前创建,将 VTK 相关的头文件包含和模块初始化移到 QApplication 创建之后。

  2. 链接错误 :确保在项目配置中包含所有必要的 VTK 库,例如 vtkCommonColor-8.2vtkGUISupportQt-8.2 等。

  3. 运行时崩溃:确保 VTK 的运行时库(DLL 文件)可访问,将 VTK 安装目录下的 bin 文件夹添加到系统环境变量 PATH 中。

  4. 编译错误 :确保包含所有必要的头文件,例如 vtkCamera.hvtkProperty.h 等。

相关推荐
sakiko_15 小时前
Swift学习笔记30-数据库SQlite语句
数据库·学习·swift
yeflx16 小时前
COTR算法demo测试
3d
小短腿的代码世界16 小时前
QCefView架构深度解析:从Chromium嵌入到Qt信号槽集成的完整技术链路
qt·架构
byxdaz16 小时前
Qt修改操作系统的日期与时间
qt
云飞云共享云桌面16 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑
小短腿的代码世界16 小时前
Qt属性系统揭秘:从Q_PROPERTY宏到动态元对象系统的完整架构解析
开发语言·qt·架构
Daniel_Coder17 小时前
iOS Widget 开发-16:Widget 网络数据加载策略
ios·swift·widget·widgetcenter
木斯佳17 小时前
HarmonyOS 6 ArkGraphics 3D精讲:坐标、向量与矩阵——初识3D数学的“空间建模”
线性代数·3d·矩阵
丁劲犇17 小时前
QodeAssist:为msys2 ucrt64 Qt Creator 注入 AI 灵魂的开源插件
开发语言·人工智能·qt
listhi52017 小时前
基于QT的串口心电波形实时显示系统
开发语言·qt