我正在尝试使用 PCLvisualizer 的点按回调。该代码使用 QVTKwidget 在 qt GUI 中显示 PCLvisualizer。下面的项目可以正常编译并且可以正常工作,但是当我包含此代码来设置回调时:
// ERROR MESSAGE OCCURS HERE !
viewer->registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);
然后此错误消息显示:
错误:C3867:'PCLViewer::callback_Test':非标准语法;使用 '&' 创建指向成员的指针
只是为了测试回调我做了一个公共函数 callback_Test() 只是打印到 qDebug
void PCLViewer::callback_Test()
{
qDebug() << "callback_Test executed";
}
我的代码有什么问题?
这是我的代码:
#include "pclviewer.h"
#include "../build/ui_pclviewer.h"
PCLViewer::PCLViewer (QWidget *parent) :
QMainWindow (parent),
ui (new Ui::PCLViewer)
{
ui->setupUi (this);
this->setWindowTitle ("PCL viewer");
// Setup the cloud pointer
cloud.reset (new PointCloudT);
// The number of points in the cloud
cloud->points.resize (200);
// The default color
red = 128;
green = 128;
blue = 128;
// Fill the cloud with some points
for (size_t i = 0; i < cloud->points.size (); ++i)
{
cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
cloud->points[i].r = red;
cloud->points[i].g = green;
cloud->points[i].b = blue;
}
// Set up the QVTK window
viewer.reset (new pcl::visualization::PCLVisualizer ("viewer", false));
ui->qvtkWidget->SetRenderWindow (viewer->getRenderWindow ());
viewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());
ui->qvtkWidget->update ();
viewer->addPointCloud (cloud, "cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
viewer->resetCamera ();
ui->qvtkWidget->update ();
// ERROR MESSAGE OCCURS HERE !
viewer->registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);
}
PCLViewer::~PCLViewer ()
{
delete ui;
}
void PCLViewer::callback_Test()
{
qDebug() << "callback_Test executed";
}
这是我的头文件:
#ifndef PCLVIEWER_H
#define PCLVIEWER_H
#include <iostream>
// Qt
#include <QMainWindow>
#include <QDebug>
// Point Cloud Library
#include <pcl/point_cloud.h>
//#include <C:\Program Files\PCL 1.8.0\include\pcl-1.8\pcl\point_cloud.h>
#include <pcl/point_types.h>
//#include <C:\Program Files\PCL 1.8.0\include\pcl-1.8\pcl\point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//#include <C:\Program Files\PCL 1.8.0\include\pcl-1.8\pcl\visualization\pcl_visualizer.h>
// Visualization Toolkit (VTK)
#include <vtkRenderWindow.h>
//#include <C:\Program Files\VTK\include\vtk-7.1\vtkRenderWindow.h>
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
namespace Ui
{
class PCLViewer;
}
class PCLViewer : public QMainWindow
{
Q_OBJECT
public:
explicit PCLViewer (QWidget *parent = 0);
~PCLViewer ();
void callback_Test();
public slots:
protected:
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
PointCloudT::Ptr cloud;
unsigned int red;
unsigned int green;
unsigned int blue;
private:
Ui::PCLViewer *ui;
};
#endif // PCLVIEWER_H