0、VDK编译 CMake + VS2017 x64

所有环境

Qt:5.12.9

Qt creator:4.12.2

VTK:8.2

Visual Studio:2017 x64(过程中配置使用,后续开发不依靠)

CMake:3.29

一、VTK下载

Download | 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动态库一股脑拷贝过来

参考文章:

Qt creator 配置VTK_qt配置vtk-CSDN博客

八、VTK安装并运行一个例子 - 星光夜 - 博客园

【转】二、VTK用于QT的安装_qt vtk教程-CSDN博客

相关推荐
雪的季节3 小时前
Qt多窗口架构设计需求简介
开发语言·qt
jingshaoqi_ccc13 小时前
windows 10系统下QT的安装及在Visual studio中的扩展安装
windows·qt·visual studio
Starry-sky(jing)15 小时前
# Linux 下 Qt 应用无障碍自动化:记一次wx无人值守系统的架构演进
linux·qt·自动化
必须得开心呀20 小时前
QT 5.11.1使用QMetaObject::invokeMethod调用函数失败,提示提示 “no such method ***”
qt
誰能久伴不乏1 天前
工业级 Modbus 上位机架构:基于滴答引擎与状态锁的高并发调度器
c++·qt·架构
代钦塔拉1 天前
Qt信号槽参数类型全解:原生类型、结构体、enum class强枚举注册与传参实战
开发语言·qt
数据法师1 天前
Crow Translate :开源桌面划词翻译工具
c++·qt·开源
尤老师FPGA1 天前
QT代码自适应窗口
开发语言·qt
郝学胜-神的一滴1 天前
Qt 高级开发 022:栅格布局深度实战
开发语言·c++·qt·软件构建·用户界面