这是一个简单的demo级别的代码,旨在测试你环境配置是否成功。
代码功能就是菜单栏点击打开pcd文件,页面加载点云。
项目地址:https://github.com/Knighthood2001/VTKDemo
代码不重要,配置的环境非常重要。
我现在配好环境后,主要使用vs写代码,然后qt creator进行查看ui。

安装
PCL1.14.0
这个我之前的博客里面写过了,由于我之前就是按照我的博客安装的,所以我这里没有安装。
VTK9.3.0
这个的话,我自己也试着别人博客,把vtk源码clone下来进行编译以及INSTALL,但是一是时间就,我编译的时候,是晚上的,睡一觉后,编译好,反正是挺长时间的,然后INSTALL的时候,好像还有3个是失败的。
因为我看到有些博客说需要修改源码,并且这个cmake配置过程有点繁琐,所以我最后采用了,使用别人编译好后的VTK9.3.0+Qt5.15.2版本的文件,然后替换到PCL1.14.0的3rdParty的VTK中。
这里需要注意的是,别人编译好的,你需要看Qt版本,有些人分享的是Qt6的,即使你下载下来,放到PCL1.14.0的3rdParty的VTK,也是不管用的,总是,需要看你使用的qt版本,然后找对应的
我这里就出现问题,即我用的qt5.15版本,但是我最开始下载的是qt6版本的,导致最后一直在报错,说找不到qt6。
最开始我想把编译出来的4个文件夹方GitHub上的,见
https://github.com/Knighthood2001/VTK9.3.0
但是有个dll大于50mb,导致最后只能放网盘里面
https://pan.quark.cn/s/7dea9939f5f6
我这里的,无论是Debug还是Release都是可以用的。
Qt5.15.2
这里的话,按照网上教程,使用在线安装安装即可。
我也写了一篇简略教程。
https://blog.csdn.net/knighthood2001/article/details/157845368
项目开始
首先,最开始,初学者,肯定会关注项目如何创建,我这里是在vs中创建的,而不是在qt creator中创建的。
安装配置qt vs tools
在vs中创建,需要先安装Qt Visual Studio Tools插件,我这里安装了一段时间。

然后安装好后重启VS,配置一下Qt version

这里看我的location虽然到的是文件夹,但是你需要选择到bin下面的qmake.exe才行。


或者你也可以试试这个Autodetect

配置好后重启一下吧。
vs创建项目





然后就创建好项目了。
然后把我的代码复制进去就行。
qt creator配置ui


注意我这边右上角创建的对象的名称的大小写。

点击这里的提升为
QVTKOpenGLNativeWidget

这里的头文件是自动填充的,虽然本地的是带有大写字母的头文件,但是其实这里全是小写也没事。然后点击添加,点击提升。
特别注意:在qt creator中修改好后ui文件,需要在vs中编译一下这个ui文件。


项目代码
VTK930.ui
cpp
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>VTK930</class>
<widget class="QMainWindow" name="VTK930">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>VTK930</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QVTKOpenGLNativeWidget" name="openGLWidget">
<property name="geometry">
<rect>
<x>29</x>
<y>39</y>
<width>731</width>
<height>501</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menufile">
<property name="title">
<string>file</string>
</property>
<addaction name="actionopen"/>
</widget>
<addaction name="menufile"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionopen">
<property name="text">
<string>open</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>QVTKOpenGLNativeWidget</class>
<extends>QOpenGLWidget</extends>
<header>qvtkopenglnativewidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
VTK930.h
cpp
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_VTK930.h"
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>
class VTK930 : public QMainWindow
{
Q_OBJECT
public:
VTK930(QWidget *parent = nullptr);
~VTK930();
private:
Ui::VTK930 ui;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
boost::shared_ptr<pcl::visualization::PCLVisualizer> view;
void initialVtkWidget();
private slots:
void onOpen();
};
VTK930.cpp
cpp
#include "VTK930.h"
#include <QFileDialog>
#include <QDebug>
VTK930::VTK930(QWidget* parent) : QMainWindow(parent) {
ui.setupUi(this);
initialVtkWidget();
connect(ui.actionopen, SIGNAL(triggered()), this, SLOT(onOpen()));
}
VTK930::~VTK930() {}
void VTK930::onOpen() {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(
new pcl::PointCloud<pcl::PointXYZ>());
QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".",
"Open PCD files(*.pcd)");
if (fileName == "") return;
pcl::io::loadPCDFile(fileName.toStdString(), *cloud);
view->addPointCloud(cloud, "cloud");
view->resetCamera();
view->spin();
ui.openGLWidget->update();
}
void VTK930::initialVtkWidget() {
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow =
vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow->AddRenderer(renderer);
view.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow,
"viewer", false));
// 参数为 R, G, B (取值范围 0.0 ~ 1.0),浅灰色
view->setBackgroundColor(0.2, 0.2, 0.2);
// 如果需要设置渐变背景(上半部分+下半部分),可以用:
// view->setBackgroundColor(0.1, 0.1, 0.1, 0.2, 0.2, 0.2);
view->setupInteractor(ui.openGLWidget->interactor(),
ui.openGLWidget->renderWindow());
ui.openGLWidget->setRenderWindow(view->getRenderWindow());
}
main.cpp
cpp
#include "VTK930.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
VTK930 window;
window.show();
return app.exec();
}
最后
但是一般来说,你这样配置后还是会出现一些报错,导致运行不起来,我下一篇就是讲遇到的报错。