环境配置
之前写了一个在CMake中使用绝对路径导入的方法链接如下
Qt+VTK+Cmake在Qt项目引入VTK
从环境搭建开始说起, 但是这个方法切换版本可能有点麻烦, 因为是使用系统环境变量的方式, 让CMake的 find_package()
在系统环境变量中找到VTK的库, 如果有版本切换(debug和release互相切换)的需要请在CMakeGUI中切换或者使用set(VTK_DIR "你得VTK路径")
(这样不就背离了我想要的不设置绝对路径了吗)
配置vtk的系统环境变量
我们编译好VTK后会执行INSTALL生成, 然后将这个生成的文件夹中的bin文件件路径添加到系统环境变量中
右键此电脑—>点击属性----->点击环境变量
在系统环境变量中找到这个变量
选择点击编辑
然后在左边点击新建将刚刚上面说的路径添加到进来
我解释一下我这里有两个的原因和用途, 如果你想让CMake的find_package()
找到那个版本的VTK就让那个路径在前面, 比如说我现在图中的vtk编译的版本debug在前面, 那么find_package()
找到的版本就是debug, 如果我想要release版本我就把下面的那个路径上移到vtk_install_debug的前面
当然我上面的vtk在E盘的原因是因为在CMake之前就设置了对应的路径CMAKE_INSTALL_PREFIX
的路径, 所以在vs2022中运行INSTALL时就是在这个路径,不然默认是C盘的C:\Program Files (x86)
文件夹下,当然这并不是本文的主题简单说一下一些细节。
完成环境配置之后开始我们的导入
使用CMake在Qt中导入VTK
这里将用到的几个CMake函数:
find_package() 、target_link_libraries() 、vtk_module_autoinit()
前两个就不赘述了, 后面这个是vtk他们定义的函数, 用来自动初始化模块, 这样就不需要再代码里面添加宏来让模块初始化了.
我的环境版本:
- QT版本:5.15.2
- CMake版本: 3.27.0
- vtk版本:9.1.0
- visual studio: 2022
创建Qt的CMake项目
下面是这几个文件的内容
CMakeLists.txt
我把多余的东西都删掉了因为我也不知道那些有什么必要, 毕竟CMake我也不是专精
cmake_minimum_required(VERSION 3.5)
project(VTKAndQt VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
# 查找并导入vtk的库
find_package(VTK)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
add_executable(VTKAndQt ${PROJECT_SOURCES} )
target_link_libraries(VTKAndQt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
# 链接vtk动态库
target_link_libraries(VTKAndQt PRIVATE ${VTK_LIBRARIES})
# 初始化vtk模块
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES}
)
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// vtk
#include <QVTKOpenGLNativeWidget.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void testVTK();
private:
Ui::MainWindow *ui;
QVTKOpenGLNativeWidget* m_vtkOpenGLWidget;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
// vtk
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkNew.h>
#include <vtkSphereSource.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_vtkOpenGLWidget = new QVTKOpenGLNativeWidget(this);
this->setCentralWidget(m_vtkOpenGLWidget);
testVTK();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::testVTK()
{
// 创建小球
vtkNew<vtkSphereSource> sphere;
sphere->SetPhiResolution(50);
sphere->SetThetaResolution(50);
sphere->SetRadius(4);
sphere->Update();
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphere->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
// 添加到渲染器中
vtkNew<vtkRenderer> renderer;
renderer->AddActor(actor);
m_vtkOpenGLWidget->renderWindow()->AddRenderer(renderer);
m_vtkOpenGLWidget->renderWindow()->Render();
}
最后的运行结果
好了vtk + vs + qt +cmake 的教程就到这里, 文章有问题再说.