qt cmake qvtkopenglwidget初始化

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

目录

首先新建个工程

配置CMakeLists.txt

在ui添加一个widget

 添加头文件

vtk初始化

示例显示


首先新建个工程

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

qt cmake qvtkopenglwidget初始化_第1张图片

命名,选择存储路径 

qt cmake qvtkopenglwidget初始化_第2张图片

 选择cmake

qt cmake qvtkopenglwidget初始化_第3张图片

 根据自己选择改名

qt cmake qvtkopenglwidget初始化_第4张图片

 根据自己系统选择

qt cmake qvtkopenglwidget初始化_第5张图片

 完成

qt cmake qvtkopenglwidget初始化_第6张图片

 新的工程建好了

配置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})

qt cmake qvtkopenglwidget初始化_第7张图片

这段代码是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

qt cmake qvtkopenglwidget初始化_第8张图片

右键单机ui中的widget,选择提升为QVTKOpenGLNativeWidget

qt cmake qvtkopenglwidget初始化_第9张图片

 确认提升

qt cmake qvtkopenglwidget初始化_第10张图片

 改名:qvtkWidget

qt cmake qvtkopenglwidget初始化_第11张图片

 添加头文件

为了pcl相关函数的方便管理,直接在qt中新建一个pcl_function.h与pcl_function.cpp的文件,将pcl头文件与相关函数统统放在这边。

添加一个类

qt cmake qvtkopenglwidget初始化_第12张图片

qt cmake qvtkopenglwidget初始化_第13张图片

qt cmake qvtkopenglwidget初始化_第14张图片

由于cmake和qmake的不同,它不会自动的把.cpp和.h加入到工程,在点击完成之后会有复制到粘贴板的一个小提示,工程已经为你打开了CMakeList.txt文件,手动添加.cpp和.h,如下图。

qt cmake qvtkopenglwidget初始化_第15张图片

 然后关闭CMakeList.txt的小窗口,点击保存全部,现在类的添加已经完成。

qt cmake qvtkopenglwidget初始化_第16张图片

 在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"

qt cmake qvtkopenglwidget初始化_第17张图片

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 渲染结果

运行一下

qt cmake qvtkopenglwidget初始化_第18张图片

能运行,但看不出到底有没有用

示例显示

可以在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();

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

qt cmake qvtkopenglwidget初始化_第19张图片

 后面再添加读取点云

你可能感兴趣的:(qt+pcl+vtk,qt,c++,开发语言)