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 <QDebug>
#include <QColorDialog>
#include <QMessageBox>
#include <QFileDialog>
#include <QTime>
#include <QDir>
#include <QFile>
#include <QtMath>
#include <QDirIterator>

添加vtk相关头文件,不然会报错

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <QVTKWidget.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>

添加新建的类

#include "pcl_function.h"

vtk初始化

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

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

vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow =vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();:创建一个 VTK 渲染窗口对象 vtkGenericOpenGLRenderWindow,使用 vtkSmartPointer 管理指针内存。renderWindow 是一个指向 vtkGenericOpenGLRenderWindow 对象的智能指针。
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::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<vtkPoints> 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<vtkCellArray> triangles;
      triangles->InsertNextCell(3);
      triangles->InsertCellPoint(0);
      triangles->InsertCellPoint(1);
      triangles->InsertCellPoint(2);

      vtkNew<vtkPolyData> trianglePolyData;
      trianglePolyData->SetPoints(points);
      trianglePolyData->SetPolys(triangles);

      vtkNew<vtkPolyDataMapper> triangleMapper;
      triangleMapper->SetInputData(trianglePolyData);

      vtkNew<vtkActor> triangleActor;
      triangleActor->SetMapper(triangleMapper);
      triangleActor->GetProperty()->SetColor(1.0, 0.0, 0.0);

      vtkNew<vtkRenderer> renderer;
      renderer->AddActor(triangleActor);

      vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow =
              vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
      renderWindow->AddRenderer(renderer);

      ui->qvtkWidget->SetRenderWindow(renderWindow);
      ui->qvtkWidget->update();

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

 后面再添加读取点云

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值