zoukankan      html  css  js  c++  java
  • [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);
    

     问题解决!!

  • 相关阅读:
    Android MulticastSocket IP组播
    IP组播技术介绍及实现例子
    机器学习:多变量线性回归
    慘挂阿里笔试题
    Android使用am命令实现拨打电话、打开应用
    社交O2O的进化
    hibernate4中HHH000273的错误
    Java中常见的排序算法
    Axure实现淡入淡出效果
    Ubuntu虚拟机+ROS+Android开发环境配置笔记
  • 原文地址:https://www.cnblogs.com/yhlx125/p/6854793.html
Copyright © 2011-2022 走看看