整理了两个工作中遇到的小问题,备忘~
1、在Qt Creator的开发环境下,当添加现有的头文件或者cpp文件后,重新qmake会发现,窗口左下角的编译和运行按钮都变灰。这是因为项目添加了新的文件后,在pro文件中会新增对应的文件名信息。而添加的文件名信息的文本会有点问题导致出现这一现象。(如下图,添加了mdetect.h文件后,编译和运行按钮都变灰)
解决方法是:在pro文件中找到对应的新添加的文件名信息,在它后面敲一个空格再退一格(看起来并没有改变什么,但确实有用,具体原因不太清楚),重新qmake之后就解决了。
2、在qt窗口中添加vtk窗口控件用于显示点云
(1)在qt的设计界面中,在窗口中添加一个qt的Widget控件,并把其名字改为qvtkwidget(后面要用到该名字,前后对应即可),如下图。
(2)在右侧属性框中,对该widget控件的类实现提升——如下图所示,右键“qvtkwidget”右侧的“QWidget”处,点击“提升为”,在弹出的对话框中,“提升的类名称”填写QVTKWidget,点击“添加”按钮后再点击提升按钮,如下下图。。
(3)做完以上两步,窗口中的设计就完成了。接下来需要用到一个自定义的类——visualizer。这是师兄编写的,直接拿来用。在项目中添加visualizer.h和visualizer.cpp文件,包含该头文件。如下图
(4)在窗口类的头文件中,定义一以下几个变量,并且在该窗口类的构造函数中加入下面一段初始化代码。
vtkSmartPointer<vtkRenderer> myRenderer;
vtkSmartPointer<vtkRenderWindow> myRenderWindow;
vtkSmartPointer<vtkRenderWindowInteractor> myInteractor;
vtkSmartPointer<vtkEventQtSlotConnect> m_connection;
boost::shared_ptr<visualizer> viewer; //可视化类
下面是加到构造函数中的代码:
//初始化vtk相关变量//
myRenderer=vtkSmartPointer<vtkRenderer>::New();
myRenderWindow=vtkSmartPointer<vtkRenderWindow>::New();
myInteractor=vtkSmartPointer<vtkRenderWindowInteractor>::New();
m_connection=vtkSmartPointer<vtkEventQtSlotConnect>::New();
myRenderWindow->AddRenderer(myRenderer);
ui->qvtkwidget->SetRenderWindow(myRenderWindow);
myRenderer->SetBackground(0.1,0.1,0.1);
//初始化显示窗口
//initialVtkWidget();
//将Viewer与qvtkwidget关联//
viewer.reset(new visualizer);
viewer->setRenderer(myRenderer);
(5)上面完成了vtk点云显示窗口的初始化。viewer变量就是一个可以实现点云显示的变量(类型是自定义的类visualizer)。根据该自定义类中的不同成员函数,可以实现几个自定义的功能。
(6)实现将点云数据显示到该窗口中的操作如下:
//显示点云到界面的窗口中
QString f_FileName="f point cloud";
double color[]={1,1,1};
viewer->addPointCloudXYZ(front_cloud,color,f_FileName);
// myRenderer->ResetCamera();
ui->qvtkwidget->update();
此处用到了成员函数addPointCloudXYZ(),需要三个参数,分别是要显示的点云的指针,颜色,以及id。详细信息可以看visualizer类的具体定义。
另外,如果要清楚窗口中的点云数据,应该可以用removePointCloud这个成员函数。
(7)重要的一点:
在操作时,按照上述步骤完成后,程序生成没有问题,但是在编译和运行的时候,会提示如下图所示的问题
解决方法为:
添加如下一段代码:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
至此,便大体实现了相关功能。至于具体可能出现的问题以及其他的相关功能,再具体分析即可。