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);
    

     问题解决!!

  • 相关阅读:
    [From 11.1~11.4]事件
    [From 10.1~10.5] 对象和集合初始化器(C#语法糖系列)
    [From 9.3]out和ref关键字
    [From 8.5]转换操作符方法
    将博客搬至CSDN
    QPS 与 TPS 简介
    在cenos中,通过subversion源码进行安装
    no acceptable C compiler found in $PATH
    tgz解压
    程序中的@Override是什么意思?
  • 原文地址:https://www.cnblogs.com/yhlx125/p/6854793.html
Copyright © 2011-2022 走看看