[QGLViewer]鼠标取点后回调

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

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

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

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

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

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

 

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

在AxMapControl中定义:

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

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

1
fun(Pnt);

在Viewer中定义成员函数

1
2
3
4
5
6
7
8
9
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);

 执行绑定操作

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

 问题解决!!

 

posted @   太一吾鱼水  阅读(391)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
历史上的今天:
2013-05-15 SDE直连
点击右上角即可分享
微信分享提示