[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); |
问题解决!!
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
分类:
编程开发集合 / C++/STL
标签:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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直连