win11下的VS2022+QT6+VTK9.2+PCL1.13.1联合开发环境配置及踩坑记录

准备工作:

**安装VS2022:**这个比较简单,网上随便找个教程就行

安装QT并为VS2022添加QT Creater插件: VS2022配置Qt6_vs2022 qt6-CSDN博客

安装PCL: vs2022配置pcl1.13.1_pcl配置-CSDN博客 安装PCL过程中本身也会安装VTK,但是这个VTK是个丐版,所以就需要下载VTK的源码编译后对PCL中的VTK进行补充

下载CMAKE-gui :(版本最好是最新)不然后面生成boost相关会报错 CMake

下载VTK :在 VTK官网 中下载VTK9.2.0待编译源码,解压后在路径Documentation/dev/bulid.md中可以看到官方提供的Prerequisites以及简易教程

编译VTK9.2:

1、VTK下载完成后解压,然后用Cmake-gui打开;新建个文件夹VTK_QT装生成后的文件,在VTK_QT中新建一个build文件夹作为安装目录

2、点击【Add Entry】按钮添加缓存变量 CMAKE_DEBUG_POSTFIX,类型为 STRING,值设置为 -gd。这样一次性就可以把release和debug分开生成。

3、单击【Configure】进行配置,根据安装的 VS2022 对应版本的生成器,选择 x64 平台。然后开始配置。配置过程中,cmake 会检测当前环境,编译器等,并生成缓存变量。第一次配置完成后,需要对一些缓存变量进行修改。

4、第一次结束后会弹出来一些红色的待确定选项:这里有几个地方要注意:

检查构建lib是否打勾:

安装目录修改成自己想要的(尽量不要默认,默认可能有权限错误):

选中Grouped和Advanced,在搜索窗口中搜索QT,将所有与QT相关的选项设置为WANT,QT版本设置为6,然后点击Configure:

Configure后会出现新的红色区域,这里是让我们选择 Qt6 中各模块的位置:

5、Configuring done 后,如果只有白色界面,代表没有错误。如果你的界面依旧有红色,返回检查以上哪步没有勾选,一直Configure到只有白色界面,最后点击 Generate,完成后打开项目,先把Debug x64打开:

右键解决方案中的ALL_BUILD,生成,完成后再右键INSTALL,生成,生成完毕ALL_BUILD应该是成功200多个,失败0 ,INSTALL是成功100多个,更新100多个,失败0。完成后换成release再重复一遍。

6、完成后在CMake设置的安装目录中找到四个文件夹,复制后替换PCL/3rdparty/VTK中的这4个文件夹,不要覆盖之前的vtk,重名的选择跳过

7、最后,如果不使用CMAKE,就把PCL\3rdParty\VTK\lib目录下新增的与QT相关的lib加到VS的属性里面。如果使用CMAKE,就在PCL安装目录的cmake目录中,打开PCLConfig.cmake,在500行左右找到这个:

用#把原来的注释了,换成(增加Qt的东西):

set(PCL_VTK_COMPONENTS "ChartsCore;CommonColor;CommonComputationalGeometry;CommonCore;CommonDataModel;CommonExecutionModel;CommonMath;CommonMisc;CommonTransforms;FiltersCore;FiltersExtraction;FiltersGeneral;FiltersGeometry;FiltersModeling;FiltersSources;ImagingCore;ImagingSources;InteractionImage;InteractionStyle;InteractionWidgets;IOCore;IOGeometry;IOImage;IOLegacy;IOPLY;RenderingAnnotation;RenderingCore;RenderingContext2D;RenderingLOD;RenderingFreeType;ViewsCore;ViewsContext2D;RenderingOpenGL2;RenderingVolumeOpenGL2;GUISupportQt;GUISupportQtQuick;GUISupportQtSQL;RenderingQt;ViewsQt")

使用QVTKOpenGLNativeWidget

配置完成后,打开.ui文件,拖一个Widget,右键选择提升,提升成QVTKOpenGLNativeWidget。

完成后在创建的界面程序的.cpp文件中使用如下函数即可实现在QT界面上显示点云文件:

cpp 复制代码
#include "MainWindow.h"
#include <qpainter.h>
#include <qdebug.h>
#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
#include <pcl/io/ply_io.h>
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkGenericOpenGLRenderWindow.h>//这个必须加

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    pcl::visualization::PCLVisualizer::Ptr viewer;
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
    auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
    auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow2->AddRenderer(renderer2);
    viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));
    ui->screen->setRenderWindow(viewer->getRenderWindow());
    viewer->setupInteractor(ui->screen->interactor(), ui->screen->renderWindow());
    pcl::io::loadPCDFile(".../xxx.pcd", *cloud);
    viewer->addPointCloud<pcl::PointXYZRGBA>(cloud, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
}

MainWindow::~MainWindow()
{
    delete ui;
}

报错解决:

1、无法打开包括文件: "QOpenGLWidget": No such file or directory

检查在Qt的include目录中QOpenGLWidget是否是在include目录下面,我的是在QOpenGLWidgets文件夹下,引入的路径修改为:#include <QOpenGLWidgets/QOpenGLWidget> 即可。

2、无法解析的外部符号QOpenGLWidget::resizeGL(int,int)" (?resizeGL@QOpenGLWidget...

打开项目属性表,选择Qt Project Settings,给Qt Modules添加opengl,给Additional Project Settings添加QT += openglwidgets,解决。

相关推荐
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
knighthood20011 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
半盏茶香2 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农2 小时前
在VScode中配置C_C++环境
c语言·c++·vscode
Jack黄从零学c++2 小时前
C++ 的异常处理详解
c++·经验分享
浮生如梦_5 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
深度学习lover5 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
捕鲸叉7 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer7 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq7 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端