所有环境
Qt:5.12.9
Qt creator:4.12.2
VTK:8.2
Visual Studio:2017 x64(过程中配置使用,后续开发不依靠)
CMake:3.29
一、VTK下载
下载vtk8.2.0压缩包

二、使用cmake-gui.exe配置VTK源码生成VS工程
1)选择VTK源码目录
2)选择编译输出目录,这里随便取个名字build_msvc
3)单击"Configure"按钮
这里我开发环境是QT X64,所以选择了X64版本

单击"Finish"后需要等一段时间,接着更新选配置项
选择安装目录,目录路径尽量不要带空格,这里我选择安装到这里D:/Programs/VTK
继续单击"Configure"

确认下QT目录和版本没有问题,继续"Configure"

勾选Advanced,找QT支持OPENGGL的和支持QT插件再勾上,再单击Configure


连续Configure直到全部没有标红色之后再单击"Generate"

可以看到D:\VTK-8.2.0\build-msvc 已经生成好VS工程了,把它打开,进行下一步编译

三、使用V2017编译VTK库
在VS的左上角选择Release,x64,然后在右侧ALL_BUILD右键点【生成】,漫长等待;

生成好后,右键点击下面INSTALL,生成的lib和dll和头文件就会被安装到D:\Programs\VTK目录里面。


Debug版本也可以编一遍,因为Debug库名称和Release一样,可以在安装目录归类一下


四、在QT里面使用VTK
1)(可选)设置VDK环境变量
不设置的话,调试过程会一直找不到动态库,QT调试会显示崩溃,VS调试会提示找不到对应动态库
可以自己手动拷贝dll库到应用程序目录下
2)安装插件

拷贝到下面

这个时候我们打开QT designer msvc x64:


五、写个小Demo调试一下
untitled9.pro (笔者不推荐使用qmake开发,cmake更为智能)
cpp
#-------------------------------------------------
# Project: MyVTKDemo
# VTK 8.2 + Qt 5 Demo (使用 QVTKOpenGLWidget)
#-------------------------------------------------
QT += core widgets gui opengl
TARGET = MyVTKDemo
TEMPLATE = app
# C++标准
CONFIG += c++11
# 输出目录设置
DESTDIR = $$OUT_PWD/bin
MOC_DIR = $$OUT_PWD/moc
OBJECTS_DIR = $$OUT_PWD/obj
RCC_DIR = $$OUT_PWD/rcc
UI_DIR = $$OUT_PWD/ui
#-------------------------------------------------
# VTK路径配置(请修改为你的VTK安装路径)
#-------------------------------------------------
VTK_PATH = D:/Programs/VTK
INCLUDEPATH += $${VTK_PATH}/include/vtk-8.2
#-------------------------------------------------
# Debug/Release配置
#-------------------------------------------------
CONFIG(debug, debug|release) {
# Debug模式
TARGET = $$join(TARGET,,,d)
LIBS += -L$${VTK_PATH}/lib/Debug
VTK_LIB_POSTFIX = -8.2
DLL_PATH = $${VTK_PATH}/bin/Debug
message("Building Debug version")
} else {
# Release模式
LIBS += -L$${VTK_PATH}/lib/Release
VTK_LIB_POSTFIX = -8.2
DLL_PATH = $${VTK_PATH}/bin/Release
message("Building Release version")
}
#-------------------------------------------------
# VTK库列表(按依赖顺序排列)
#-------------------------------------------------
VTK_LIBS = \
vtkCommonCore$${VTK_LIB_POSTFIX} \
vtkCommonMath$${VTK_LIB_POSTFIX} \
vtkCommonMisc$${VTK_LIB_POSTFIX} \
vtkCommonSystem$${VTK_LIB_POSTFIX} \
vtkCommonTransforms$${VTK_LIB_POSTFIX} \
vtkCommonDataModel$${VTK_LIB_POSTFIX} \
vtkCommonColor$${VTK_LIB_POSTFIX} \
vtkCommonExecutionModel$${VTK_LIB_POSTFIX} \
vtkCommonComputationalGeometry$${VTK_LIB_POSTFIX} \
vtkFiltersCore$${VTK_LIB_POSTFIX} \
vtkFiltersGeneral$${VTK_LIB_POSTFIX} \
vtkFiltersSources$${VTK_LIB_POSTFIX} \
vtkRenderingCore$${VTK_LIB_POSTFIX} \
vtkRenderingOpenGL2$${VTK_LIB_POSTFIX} \
vtkRenderingFreeType$${VTK_LIB_POSTFIX} \
vtkRenderingGL2PSOpenGL2$${VTK_LIB_POSTFIX} \
vtkRenderingContextOpenGL2$${VTK_LIB_POSTFIX} \
vtkRenderingVolume$${VTK_LIB_POSTFIX} \
vtkRenderingVolumeOpenGL2$${VTK_LIB_POSTFIX} \
vtkRenderingLabel$${VTK_LIB_POSTFIX} \
vtkInteractionStyle$${VTK_LIB_POSTFIX} \
vtkInteractionWidgets$${VTK_LIB_POSTFIX} \
vtkGUISupportQt$${VTK_LIB_POSTFIX} \
vtkGUISupportQtOpenGL$${VTK_LIB_POSTFIX}
# 添加VTK库到链接
for(lib, VTK_LIBS) {
LIBS += -l$${lib}
}
#-------------------------------------------------
# 源文件
#-------------------------------------------------
SOURCES += \
main.cpp \
MainWindow.cpp
HEADERS += \
MainWindow.h
#-------------------------------------------------
# 编译选项
#-------------------------------------------------
# 忽略特定警告
QMAKE_CXXFLAGS += -wd4068 # 忽略未知#pragma警告
# 打印配置信息
message("----------------------------------------")
message("VTK Path: $${VTK_PATH}")
message("Include Path: $${INCLUDEPATH}")
message("Library Path: $${LIBS}")
message("----------------------------------------")
main.cpp
cpp
#include <QApplication>
#include <QSurfaceFormat>
#include "MainWindow.h"
// VTK模块初始化(必须!)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
// 如果需要渲染体积数据,可以添加:
// VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
int main(int argc, char *argv[])
{
// 设置OpenGL格式(必须在QApplication创建之前)
QSurfaceFormat format = QVTKOpenGLWidget::defaultFormat();
format.setSamples(4); // 设置抗锯齿
format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(3, 2);
QSurfaceFormat::setDefaultFormat(format);
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
MainWindow.h
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// VTK 8.2 使用 QVTKOpenGLWidget(替代已废弃的 QVTKWidget)
#include <QVTKOpenGLWidget.h>
// VTK前向声明
class vtkConeSource;
class vtkPolyDataMapper;
class vtkActor;
class vtkRenderer;
class vtkRenderWindow;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
void setupVTK(); // 初始化VTK
void setupUI(); // 初始化UI
private:
QVTKOpenGLWidget *m_vtkWidget; // VTK显示组件(使用OpenGL)
// VTK对象指针
vtkConeSource *m_coneSource;
vtkPolyDataMapper *m_mapper;
vtkActor *m_actor;
vtkRenderer *m_renderer;
};
#endif // MAINWINDOW_H
MainWindow.cpp
cpp
#include "MainWindow.h"
#include <QVBoxLayout>
#include <QStatusBar>
#include <QLabel>
#include <QDebug>
#include <QSurfaceFormat>
// VTK头文件
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkProperty.h>
#include <vtkCamera.h>
#include <vtkAutoInit.h>
// VTK模块初始化(只需要在main.cpp中包含一次,这里注释掉)
// VTK_MODULE_INIT(vtkRenderingOpenGL2)
// VTK_MODULE_INIT(vtkInteractionStyle)
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, m_vtkWidget(nullptr)
, m_coneSource(nullptr)
, m_mapper(nullptr)
, m_actor(nullptr)
, m_renderer(nullptr)
{
// 设置OpenGL格式(重要!)
QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat());
setupUI();
setupVTK();
}
void MainWindow::setupUI()
{
// 创建中央窗口部件
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
// 创建布局
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
// 创建VTK OpenGL Widget
m_vtkWidget = new QVTKOpenGLWidget(centralWidget);
layout->addWidget(m_vtkWidget);
// 设置窗口属性
setWindowTitle("VTK 8.2 + Qt 5 Demo (使用 QVTKOpenGLWidget)");
resize(800, 600);
// 创建状态栏
statusBar()->showMessage("VTK圆锥体示例 - 鼠标拖拽旋转视角");
}
void MainWindow::setupVTK()
{
// 使用智能指针避免内存泄漏
vtkSmartPointer<vtkConeSource> m_coneSource =
vtkSmartPointer<vtkConeSource>::New();
m_coneSource->SetHeight(3.0);
m_coneSource->SetRadius(1.0);
m_coneSource->SetResolution(50);
// 创建Mapper
vtkSmartPointer<vtkPolyDataMapper> m_mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
m_mapper->SetInputConnection(m_coneSource->GetOutputPort());
// 创建Actor
vtkSmartPointer<vtkActor> m_actor =
vtkSmartPointer<vtkActor>::New();
m_actor->SetMapper(m_mapper);
// 设置材质属性
m_actor->GetProperty()->SetColor(1.0, 0.5, 0.0);
m_actor->GetProperty()->SetSpecular(0.3);
m_actor->GetProperty()->SetSpecularPower(20);
m_actor->GetProperty()->SetDiffuse(0.8);
m_actor->GetProperty()->SetAmbient(0.2);
// 创建Renderer
vtkSmartPointer<vtkRenderer> m_renderer =
vtkSmartPointer<vtkRenderer>::New();
m_renderer->AddActor(m_actor);
m_renderer->SetBackground(0.1, 0.2, 0.4);
// 设置RenderWindow
vtkRenderWindow *renderWindow = m_vtkWidget->GetRenderWindow();
renderWindow->AddRenderer(m_renderer);
// 相机设置
m_renderer->GetActiveCamera()->SetPosition(5, 5, 10);
m_renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
m_renderer->GetActiveCamera()->SetViewUp(0, 1, 0);
// 重置相机并渲染
m_renderer->ResetCamera();
renderWindow->Render();
qDebug() << "VTK初始化完成,圆锥体显示成功";
}
MainWindow::~MainWindow()
{
// 释放VTK对象(必须!防止内存泄漏)
if (m_coneSource) {
m_coneSource->Delete();
m_coneSource = nullptr;
}
if (m_mapper) {
m_mapper->Delete();
m_mapper = nullptr;
}
if (m_actor) {
m_actor->Delete();
m_actor = nullptr;
}
if (m_renderer) {
m_renderer->Delete();
m_renderer = nullptr;
}
}
把VTK动态库一股脑拷贝过来
参考文章: