[QGLViewer]鼠标取点后回调

纠结的一天:QGLViewer控件重载鼠标事件(AxMapControl类),如何在点击鼠标之后执行一个回调,通知主界面Viewer类执行一个操作。

先是考虑直接使用C风格的回调函数,在AxMapControl类中定义类似于这种形式

typedef void (*DirectionSetCallback)(qglviewer::Vec Pnt);

可是这种情况下,如果定义全局的DirectionSetCallback,必须定义过程级的回调函数,这时候没有办法使用Viewer类的私有变量。不过用一个静态的Viewer过程级全局静态变量,问题倒是可以解决。

如果给Viewer定义一个静态成员函数,在定义一个Viewer类指向自身的静态成员变量,编译的时候又出现一堆子问题。

交叉引用也不行,本来Viewer类包含了AxMapControl的引用,如果想在AxMapControl中引用Viewer类,就产生交叉引用。这时候也是一堆子问题。

不过猛然发现,原来c++的std::fonction和std::bind可以实现这个功能。真的是太好了,自己对C++的知识还是不够扎实。

在AxMapControl中定义:

std::function<void(qglviewer::Vec Pnt)> fun;

 在鼠标事件void AxMapControl::mousePressEvent(QMouseEvent* e)中执行回调操作

fun(Pnt);

在Viewer中定义成员函数

void AxControlViewer:: OnDirectionSetCallback(qglviewer::Vec Pnt)  
{  
	double poseX=Pnt.x*1000;
	double poseY=Pnt.y*1000;
	
	robot.setFlag(ROBOT_STOP);
	robot.setPoseToGoto(poseX,poseY,0);
	robot.setFlag(ROBOT_LOCALIZETOPOSE);
}  

 执行绑定操作

m_glwidget->fun=std::bind(&AxControlViewer::OnDirectionSetCallback,this,std::placeholders::_1);

 问题解决!!

原文地址:https://www.cnblogs.com/yhlx125/p/6854793.html