windows搭建Qt与VTK

最后更新时间:2022.10.16


参考内容:开源地址


工具

  • VS2022
  • Qt 6.4
  • CMake 3.24.2
  • VTK9.2.2源码

编译VTK

  1. 下载源码解压;
  2. 在源码中创建一个build文件夹用于源外构建
  3. 通过菜单栏中的x64 Native Tools Command Prompt for VS 2022打开CMake GUI,然后使用如下配置:
  • 指定安装目录
  • 打开MPI(可选)
    在这里插入图片描述

在这里插入图片描述
其他不变

  1. 然后配置 -> 生成 -> 打开项目
  2. 然后BUILDALL
  3. 然后将INSTALL项目设置为启动项
  4. 最后在build文件夹下使用cmake --install .命令将生成的库和头文件安装到前面设置的安装位置

生成文件结构如下:
在这里插入图片描述
然后就能够使用库文件了。

Qt使用

1. QMake项目

QMake文件文件如下:

QT       += core gui openglwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Assign include header path
INCLUDEPATH += E:/DesktopFiles/Learn/VTK/VTKProject/vtk_build/release/include/vtk-9.2
# Assign lib search path
QMAKE_LIBDIR += E:/DesktopFiles/Learn/VTK/VTKProject/vtk_build/release/lib

# Set link lib
LIBS +=vtkcgns-9.2.lib\
       vtkChartsCore-9.2.lib\
       vtkCommonColor-9.2.lib\
       vtkCommonComputationalGeometry-9.2.lib\
       vtkCommonCore-9.2.lib\
       vtkCommonDataModel-9.2.lib\
       vtkCommonExecutionModel-9.2.lib\
       vtkCommonMath-9.2.lib\
       vtkCommonMisc-9.2.lib\
       vtkCommonSystem-9.2.lib\
       vtkCommonTransforms-9.2.lib\
       vtkDICOMParser-9.2.lib\
       vtkDomainsChemistry-9.2.lib\
       vtkDomainsChemistryOpenGL2-9.2.lib\
       vtkDomainsParallelChemistry-9.2.lib\
       vtkdoubleconversion-9.2.lib\
       vtkexodusII-9.2.lib\
       vtkexpat-9.2.lib\
       vtkFiltersAMR-9.2.lib\
       vtkFiltersCore-9.2.lib\
       vtkFiltersExtraction-9.2.lib\
       vtkFiltersFlowPaths-9.2.lib\
       vtkFiltersGeneral-9.2.lib\
       vtkFiltersGeneric-9.2.lib\
       vtkFiltersGeometry-9.2.lib\
       vtkFiltersHybrid-9.2.lib\
       vtkFiltersHyperTree-9.2.lib\
       vtkFiltersImaging-9.2.lib\
       vtkFiltersModeling-9.2.lib\
       vtkFiltersParallel-9.2.lib\
       vtkFiltersParallelGeometry-9.2.lib\
       vtkFiltersParallelImaging-9.2.lib\
       vtkFiltersParallelMPI-9.2.lib\
       vtkFiltersParallelVerdict-9.2.lib\
       vtkFiltersPoints-9.2.lib\
       vtkFiltersProgrammable-9.2.lib\
       vtkFiltersSelection-9.2.lib\
       vtkFiltersSMP-9.2.lib\
       vtkFiltersSources-9.2.lib\
       vtkFiltersStatistics-9.2.lib\
       vtkFiltersTexture-9.2.lib\
       vtkFiltersTopology-9.2.lib\
       vtkFiltersVerdict-9.2.lib\
       vtkfmt-9.2.lib\
       vtkfreetype-9.2.lib\
       vtkGeovisCore-9.2.lib\
       vtkgl2ps-9.2.lib\
       vtkglew-9.2.lib\
       vtkGUISupportQt-9.2.lib\
       vtkGUISupportQtQuick-9.2.lib\
       vtkGUISupportQtSQL-9.2.lib\
       vtkhdf5-9.2.lib\
       vtkhdf5_hl-9.2.lib\
       vtkImagingColor-9.2.lib\
       vtkImagingCore-9.2.lib\
       vtkImagingFourier-9.2.lib\
       vtkImagingGeneral-9.2.lib\
       vtkImagingHybrid-9.2.lib\
       vtkImagingMath-9.2.lib\
       vtkImagingMorphological-9.2.lib\
       vtkImagingSources-9.2.lib\
       vtkImagingStatistics-9.2.lib\
       vtkImagingStencil-9.2.lib\
       vtkInfovisCore-9.2.lib\
       vtkInfovisLayout-9.2.lib\
       vtkInteractionImage-9.2.lib\
       vtkInteractionStyle-9.2.lib\
       vtkInteractionWidgets-9.2.lib\
       vtkIOAMR-9.2.lib\
       vtkIOAsynchronous-9.2.lib\
       vtkIOCesium3DTiles-9.2.lib\
       vtkIOCGNSReader-9.2.lib\
       vtkIOChemistry-9.2.lib\
       vtkIOCityGML-9.2.lib\
       vtkIOCONVERGECFD-9.2.lib\
       vtkIOCore-9.2.lib\
       vtkIOEnSight-9.2.lib\
       vtkIOExodus-9.2.lib\
       vtkIOExport-9.2.lib\
       vtkIOExportGL2PS-9.2.lib\
       vtkIOExportPDF-9.2.lib\
       vtkIOGeometry-9.2.lib\
       vtkIOHDF-9.2.lib\
       vtkIOImage-9.2.lib\
       vtkIOImport-9.2.lib\
       vtkIOInfovis-9.2.lib\
       vtkIOIOSS-9.2.lib\
       vtkIOLegacy-9.2.lib\
       vtkIOLSDyna-9.2.lib\
       vtkIOMINC-9.2.lib\
       vtkIOMotionFX-9.2.lib\
       vtkIOMovie-9.2.lib\
       vtkIOMPIImage-9.2.lib\
       vtkIONetCDF-9.2.lib\
       vtkIOOggTheora-9.2.lib\
       vtkIOParallel-9.2.lib\
       vtkIOParallelNetCDF-9.2.lib\
       vtkIOParallelXML-9.2.lib\
       vtkIOPLY-9.2.lib\
       vtkIOSegY-9.2.lib\
       vtkIOSQL-9.2.lib\
       vtkioss-9.2.lib\
       vtkIOTecplotTable-9.2.lib\
       vtkIOVeraOut-9.2.lib\
       vtkIOVideo-9.2.lib\
       vtkIOXML-9.2.lib\
       vtkIOXMLParser-9.2.lib\
       vtkjpeg-9.2.lib\
       vtkjsoncpp-9.2.lib\
       vtkkissfft-9.2.lib\
       vtklibharu-9.2.lib\
       vtklibproj-9.2.lib\
       vtklibxml2-9.2.lib\
       vtkloguru-9.2.lib\
       vtklz4-9.2.lib\
       vtklzma-9.2.lib\
       vtkmetaio-9.2.lib\
       vtknetcdf-9.2.lib\
       vtkogg-9.2.lib\
       vtkParallelCore-9.2.lib\
       vtkParallelDIY-9.2.lib\
       vtkParallelMPI-9.2.lib\
       vtkpng-9.2.lib\
       vtkpugixml-9.2.lib\
       vtkRenderingAnnotation-9.2.lib\
       vtkRenderingContext2D-9.2.lib\
       vtkRenderingContextOpenGL2-9.2.lib\
       vtkRenderingCore-9.2.lib\
       vtkRenderingFreeType-9.2.lib\
       vtkRenderingGL2PSOpenGL2-9.2.lib\
       vtkRenderingHyperTreeGrid-9.2.lib\
       vtkRenderingImage-9.2.lib\
       vtkRenderingLabel-9.2.lib\
       vtkRenderingLICOpenGL2-9.2.lib\
       vtkRenderingLOD-9.2.lib\
       vtkRenderingOpenGL2-9.2.lib\
       vtkRenderingQt-9.2.lib\
       vtkRenderingSceneGraph-9.2.lib\
       vtkRenderingUI-9.2.lib\
       vtkRenderingVolume-9.2.lib\
       vtkRenderingVolumeOpenGL2-9.2.lib\
       vtkRenderingVtkJS-9.2.lib\
       vtksqlite-9.2.lib\
       vtksys-9.2.lib\
       vtkTestingRendering-9.2.lib\
       vtktheora-9.2.lib\
       vtktiff-9.2.lib\
       vtkverdict-9.2.lib\
       vtkViewsContext2D-9.2.lib\
       vtkViewsCore-9.2.lib\
       vtkViewsInfovis-9.2.lib\
       vtkViewsQt-9.2.lib\
       vtkWrappingTools-9.2.lib\
       vtkzlib-9.2.lib


SOURCES += \
    main.cpp \
    mainwindow.cpp\


HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

重要的是:

  1. 在designer中放入一个Widget部件,然后将其提升为QVTKOpenGLNativeWidget,然后进行qmake
  2. 由于我们使用的是release 的VTK库所以我们项目必须调成Release的。否者会报错。【报错内容: QWidget: Must construct a QApplication before a QWidget】目前我没去处理这,有知道的大佬请留言
  3. 如果不出意外的话就会有如下的运行结果。

在这里插入图片描述
在这里插入图片描述


我们来写一点实现:

/**! MainWindow.cpp*/

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkSphereSource.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkGenericOpenGLRenderWindow.h>


#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

    vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();

    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();

    vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();

    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();

    sphereActor->SetMapper(sphereMapper);
    //sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(sphereActor);
    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());

    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");


    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    renW=ui->widget;
    renW->setRenderWindow(renderWindow);
}

MainWindow::~MainWindow()
{
    delete ui;
}


最后的效果:
在这里插入图片描述

2. CMake项目

这里使用CMake进行项目的管理
CMakeList.txt文件如下:

cmake_minimum_required(VERSION 3.24)

project(QtVtkViewer)

set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# List source files & resources
file (GLOB Sources *.cpp)
file (GLOB Headers *.h)
file (GLOB Resources *.qrc)
file (GLOB UIs *.ui)

# Find package Qt
find_package(Qt6Core REQUIRED)
find_package(Qt6Gui REQUIRED)
find_package(Qt6Widgets REQUIRED)
find_package(Qt6OpenGL REQUIRED)

# Use Qt
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# Find package VTK
find_package(VTK
    9.2.2
    REQUIRED
    COMPONENTS
        GUISupportQt
        IOLegacy)

# Build executable
add_executable(QtVtkViewer WIN32 ${Sources} ${Headers} ${Resources} ${UIs})

target_link_libraries(QtVtkViewer PRIVATE Qt6::Widgets Qt6::OpenGL VTK::GUISupportQt VTK::IOLegacy)

vtk_module_autoinit(
    TARGETS QtVtkViewer
    MODULES VTK::GUISupportQt VTK::IOLegacy)

最后效果如下:
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值