纠结的一天: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);

问题解决!!

[QGLViewer]鼠标取点后回调的更多相关文章

  1. OpenCV学习3-----利用鼠标、键盘回调函数实现标定人体关节点

    最近做实验,需要一些人体关节点的ground truth,需要自己手动标定,于是尝试使用OpenCV的鼠标键盘回调函数实现. 期间遇到不少问题,记录一下. 首先就是鼠标回调函数注册, namedWin ...

  2. GetWord 3.3 屏幕取词

    1. 缘起 要搞一个作弊软件,需要把屏幕上的试题取下来. 据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件. 发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一 ...

  3. Breakpad Google的crash捕获、抓取开源库

    简介: Breadpad为google chrominum项目下用于处理dump的一套工具:内部采用跨平台方式实现捕获.生成.解析与平台无关的dump,便于统一处理:支持进程内与进程外捕获,当为进程外 ...

  4. opencv鼠标操作及GUI矩形绘画

    OpenCV的鼠标操作是通过一个中介函数配合回调函数来实现的.指定鼠标操作消息回调函数的函数为SetMouseCallback. void setMouseCallback(const string& ...

  5. duilib中edit获得鼠标焦点后右边框被覆盖

    转载:http://www.cnblogs.com/minggong/p/6457734.html 用duilib做了一个窗口,窗口内有一个供用户输入使用的是edit控件. XML中是这样写的: &l ...

  6. 解决方案--duilib中edit获得鼠标焦点后右边框被覆盖

    用duilib做了一个登录框,用户名的输入使用的是edit控件. XML中是这样写的: <Edit name="subdomain_edit" tipvalue=" ...

  7. HighGUI图形图像界面初步——鼠标操作

    OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的,创建和指定滑动条回调函数为createTrackbar, 而指定鼠标操作消息回调函数的函数为setM ...

  8. C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决

    http://www.csharpwin.com/csharpspace/3766r5747.shtml 在.net 2005平台下 在使用全局hook时,总是遇见SetWindowsHookEx的返 ...

  9. 从零开始openGL——三、模型加载及鼠标交互实现

    前言 在上篇文章中,介绍了基本图形的绘制.这篇博客中将介绍模型的加载.绘制以及鼠标交互的实现. 模型加载 模型存储 要实现模型的读取.绘制,我们首先需要知道模型是如何存储在文件中的. 通常模型是由网格 ...

随机推荐

  1. ftp服务器Serv-U 设置允许自动创建不存在的目录

    一.由来 最近改写了项目中ftp上传部分的代码. 用到的组件为: <dependency> <groupId>commons-net</groupId> <a ...

  2. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块

    实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念. ...

  3. vb学习基础之val函数与val(&HFFFF) 的理解

    在VB语言中,val函数可以把数值字符串==转为==>数值的函数,在它不能识别为数字的第一个字符上,停止读入字符串. 那些被认为是数值的一部分的符号和字符,例如美元号与逗号,都不能被识别.但是能 ...

  4. Sciter返回json

    sciter::value arr[200]; for (int i = 0; i < (int)m_fileList.size(); i++) { cv::Mat img = cv::imre ...

  5. emmet前端模板

    https://github.com/emmetio/emmet/blob/master/lib/snippets.json "emmet.extensionsPath": &qu ...

  6. Semver(语义化版本号)扫盲

    最近Github 10周年在朋友圈里沸沸扬扬刷屏,小编在工作中却惊讶的发现不少同事对版本号中的beta和rc没有概念,使用 npm install package@next 时,也不清楚next代表的 ...

  7. 怎么给button设置背景颜色?【Android】

    怎么给button设置背景颜色?[Android] 怎么给button设置背景颜色?[Android] 现在我想给按钮添加背景颜色,怎么做 1.android:background="@an ...

  8. thymeleaf 标签的使用

    1.html页面 2.<label class="control-label col-sm-1" for="vehiclesFormalities"> ...

  9. vue项目打包后一片空白及资源引入的路径报错解决办法

    网上很多说自己的VUE项目通过Webpack打包生成的list文件,放到HBulider打包后,通过手机打开一片空白.这个主要原因是路径的问题. 1.记得改一下config下面的index.js中bu ...

  10. day2:day1作业 字符编码

    1,使用while循环输出1,2,3,4,5,6,8,9 # 使用while循环输出1,2,3,4,5,6,8,9 num = 1 while num <= 10: if num != 7: p ...