0

我正在尝试使用 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
4

3 回答 3

1

感谢@Some程序员花花公子的评论,我发现了问题:

解决方案:

1) 我在 PCLViewer 类之外声明了 callback_Test

2)我使用了调用回调的代码所期望的两个参数

头文件:

#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>

// included this as well -- however it seems to not be needed
//#include <pcl/visualization/point_picking_event.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 ();



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;

};
// ########################################################################################
// DECLARE OUTSIDE OF CLASS! WITH TWO ARGUMENTS

void callback_Test(const pcl::visualization::PointPickingEvent& event, void* viewer_void);

#endif // PCLVIEWER_H

然后我在没有 &; 的情况下调用了 registerPointPickingCallback

// NOW ITS OK and no & is needed since callback_Test is outside the PCLViewer class 
  viewer->registerPointPickingCallback (callback_Test,(void*)&viewer);

下面的代码有效。

.CPP 文件:

#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 ();

  // NOW ITS OK and no & is needed since callback_Test is outside the PCLViewer class 
  viewer->registerPointPickingCallback (callback_Test,(void*)&viewer);
}

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


void callback_Test (const pcl::visualization::PointPickingEvent& event, void* viewer_void)
{
    qDebug() << "callback_Test executed";
}
于 2018-03-05T12:50:32.513 回答
0

如果有人遇到这个(并且想要使用成员函数)。我使用以下方法解决了它。只需将您的函数定义为成员并使用 *this:

viewer->registerPointPickingCallback (&PCLViewer::callback_Test,*this)

于 2020-04-22T12:13:04.630 回答
0

您问题的实际答案是您需要像编译器告诉您的那样包含 &

viewer->registerPointPickingCallback (&PCLViewer::callback_Test,(void*)&viewer)
于 2018-03-15T10:01:39.797 回答