qt小白,记录一下学习过程,vtk8.2及以后使用qvtkwidget不是不能用,在应用程序输出会弹出两行提示你qvtkwidget过期了,我是没找到法子给它屏蔽了,只能设置应用程序输出在运行时不自动弹出,眼不见心不烦。
目录
首先新建个工程
配置CMakeLists.txt
在ui添加一个widget
添加头文件
vtk初始化
示例显示
左上角:文件->新建文件或项目
命名,选择存储路径
选择cmake
根据自己选择改名
根据自己系统选择
完成
新的工程建好了
添加下面的代码
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
include_directories(${VTK_INCLUDE_DIRS})
link_directories(${VTK_LIBRARY_DIRS})
这段代码是CMakeLists.txt文件中与PCL库相关的代码。
find_package(PCL REQUIRED):在系统中查找PCL库并将其引入项目中,REQUIRED表示如果未找到PCL库则会发生错误并停止构建。
include_directories(${PCL_INCLUDE_DIRS}):添加PCL库头文件的路径到项目中,以便在项目中包含PCL库的头文件。
link_directories(${PCL_LIBRARY_DIRS}):将PCL库的路径添加到链接器搜索路径中,以便在编译时可以正确链接PCL库。
add_definitions(${PCL_DEFINITIONS}):将PCL库定义的宏添加到项目中,以便在编译时使用这些宏。
find_package(VTK REQUIRED) 用于查找 VTK 库,这个命令会自动查找系统中是否安装了 VTK 库,如果找到了就会设置相关的变量,例如 VTK_INCLUDE_DIRS、VTK_LIBRARY_DIRS 和 VTK_LIBRARIES 等。
include(${VTK_USE_FILE}) 用于包含 VTK 库的相关配置文件。这个文件会设置一些编译选项、宏定义等。
include_directories(${VTK_INCLUDE_DIRS}) 用于添加 VTK 库的头文件搜索路径,使得编译器能够找到 VTK 相关的头文件。
link_directories(${VTK_LIBRARY_DIRS}) 用于添加 VTK 库的库文件搜索路径,使得链接器能够找到 VTK 相关的库文件。
链接pcl,vtk
在 target_link_libraries 后面添加
${PCL_LIBRARIES} ${VTK_LIBRARIES}
${PCL_LIBRARIES} 变量是由前面 find_package(PCL REQUIRED) 命令定义的,用于包含 PCL 库的所有模块的名称。
右键单机ui中的widget,选择提升为QVTKOpenGLNativeWidget
确认提升
改名:qvtkWidget
为了pcl相关函数的方便管理,直接在qt中新建一个pcl_function.h与pcl_function.cpp的文件,将pcl头文件与相关函数统统放在这边。
添加一个类
由于cmake和qmake的不同,它不会自动的把.cpp和.h加入到工程,在点击完成之后会有复制到粘贴板的一个小提示,工程已经为你打开了CMakeList.txt文件,手动添加.cpp和.h,如下图。
然后关闭CMakeList.txt的小窗口,点击保存全部,现在类的添加已经完成。
在mainwindow.h中添加qt的基本头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include
添加vtk相关头文件,不然会报错
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include
#include
#include
#include
#include
#include
#include
添加新建的类
#include "pcl_function.h"
在mainwindow.cpp构造函数中添加vtk初始化
vtkSmartPointer renderWindow =
vtkSmartPointer::New();
vtkSmartPointer renderer =
vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
ui->qvtkWidget->SetRenderWindow(renderWindow);
ui->qvtkWidget->update();
vtkSmartPointer
vtkSmartPointer
renderWindow->AddRenderer(renderer);:将创建的渲染器 renderer 添加到渲染窗口 renderWindow 中,以便将来显示渲染的结果。
ui->qvtkWidget->SetRenderWindow(renderWindow);:将创建的渲染窗口 renderWindow 设置为 Qt 窗口部件 ui->qvtkWidget 所使用的 VTK 渲染窗口,以便在 Qt 界面中显示 VTK 渲染结果。ui->qvtkWidget->update(); 刷新 VTK 渲染结果
运行一下
能运行,但看不出到底有没有用
可以在ui中添加一个pushbutton,右击,转到槽,选择第一个clicked()
自动跳转到mainwindow.cpp下,在大括号中添加如下代码显示一个红色三角形
vtkNew points;
points->InsertNextPoint(0.0, 0.0, 0.0);
points->InsertNextPoint(1.0, 0.0, 0.0);
points->InsertNextPoint(0.5, 1.0, 0.0);
vtkNew triangles;
triangles->InsertNextCell(3);
triangles->InsertCellPoint(0);
triangles->InsertCellPoint(1);
triangles->InsertCellPoint(2);
vtkNew trianglePolyData;
trianglePolyData->SetPoints(points);
trianglePolyData->SetPolys(triangles);
vtkNew triangleMapper;
triangleMapper->SetInputData(trianglePolyData);
vtkNew triangleActor;
triangleActor->SetMapper(triangleMapper);
triangleActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkNew renderer;
renderer->AddActor(triangleActor);
vtkSmartPointer renderWindow =
vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
ui->qvtkWidget->SetRenderWindow(renderWindow);
ui->qvtkWidget->update();
运行一下,点击按钮,出现三角形
后面再添加读取点云