PCL点云开发-解决在Qt中嵌入点云窗口出现的一闪而过的黑窗口
PCL点云开发-解决在Qt中嵌入点云窗口出现的一闪而过的黑窗口
众所周知,在windows下开发PCL点云最快的方式就是到官网下载其预编译好的库,比如:
PCL-1.14.0-AllInOne-msvc2022-win64.exe
这时候你到网络上搜索,大概率会有两种方案:
1、等PCL创建好窗口后,拿到该窗口的句柄,使用Qt的API将其嵌入到QWidget中,这就是为什么会出现一闪而过的黑窗口的原因
2、重新编译VTK以及PCL库,打开Qt支持模块,在Qt中将QOpenGLWidget提升为PCLQVTKWidget
喜欢偷懒的程序员怎么可能会去编译源码呢,绝不可能😂,那就研究下第一种方案如何解决一闪而过的黑窗口。
按照这种思路思考,第一种方案是不是在其创建RenderWindow的时候不显示窗口,等其嵌入Qt控件的时候显示就可以了。是的就是这么简单,怎么做呢?打开格局就可以了,格局如下:
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkRenderer.h>
#include <QApplication>
#include <QMainWindow>
#include <QWindow>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
pcl::visualization::PCLVisualizer::Ptr viewer;
// 创建渲染器
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
// 创建渲染窗口
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
// 设置渲染窗口不显示
renderWindow->SetShowWindow(false);
// 构造PCLVisualizer
viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", true));
// 将renderWindow的嵌入到QWidget中
auto viewerWinId = QWindow::fromWinId((WId)renderWindow->GetGenericWindowId());
auto widget = QWidget::createWindowContainer(viewerWinId, nullptr);
widget->show();
// 添加点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
cloud->resize(500);
for (auto &point : *cloud) {
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
point.r = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
point.g = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
point.b = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
}
viewer->addPointCloud(cloud, "cloud");
return a.exec();
}
效果如下: