qt cmake qvtkopenglwidget初始化

qt小白,记录一下学习过程,vtk8.2及以后使用qvtkwidget不是不能用,在应用程序输出会弹出两行提示你qvtkwidget过期了,我是没找到法子给它屏蔽了,只能设置应用程序输出在运行时不自动弹出,眼不见心不烦。

目录

首先新建个工程

配置CMakeLists.txt

在ui添加一个widget

 添加头文件

vtk初始化

示例显示


首先新建个工程

左上角:文件->新建文件或项目

命名,选择存储路径 

 选择cmake

 根据自己选择改名

 根据自己系统选择

 完成

 新的工程建好了

配置CMakeLists.txt

 添加下面的代码

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

右键单机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"

vtk初始化

 在mainwindow.cpp构造函数中添加vtk初始化

vtkSmartPointer renderWindow =vtkSmartPointer::New();
vtkSmartPointer renderer =vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
ui->qvtkWidget->SetRenderWindow(renderWindow);
ui->qvtkWidget->update();

vtkSmartPointer renderWindow =vtkSmartPointer::New();:创建一个 VTK 渲染窗口对象 vtkGenericOpenGLRenderWindow,使用 vtkSmartPointer 管理指针内存。renderWindow 是一个指向 vtkGenericOpenGLRenderWindow 对象的智能指针。
vtkSmartPointer renderer = vtkSmartPointer::New();:创建一个 VTK 渲染器对象 vtkRenderer,同样使用 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();

运行一下,点击按钮,出现三角形

 后面再添加读取点云


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部