最后更新时间:2022.10.16
参考内容:开源地址
工具
- VS2022
- Qt 6.4
- CMake 3.24.2
- VTK9.2.2源码
编译VTK
- 下载源码解压;
- 在源码中创建一个
build
文件夹用于源外构建 - 通过菜单栏中的
x64 Native Tools Command Prompt for VS 2022
打开CMake GUI,然后使用如下配置:
- 指定安装目录
- 打开MPI(可选)
其他不变
- 然后配置 -> 生成 -> 打开项目
- 然后BUILDALL
- 然后将INSTALL项目设置为启动项
- 最后在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
重要的是:
- 在designer中放入一个
Widget
部件,然后将其提升为QVTKOpenGLNativeWidget
,然后进行qmake
。 - 由于我们使用的是release 的VTK库所以我们项目必须调成
Release
的。否者会报错。【报错内容: QWidget: Must construct a QApplication before a QWidget】目前我没去处理这,有知道的大佬请留言
- 如果不出意外的话就会有如下的运行结果。
我们来写一点实现:
/**! 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)
最后效果如下: