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

     问题解决!!

  • 相关阅读:
    JS系统函数
    匿名函数
    使用递归计算1~n之间所有整数的和
    交换两个变量的值
    创建函数,传递一个数字n,返回斐波那契数列的第n的值。
    创建函数function
    打印本世纪(2000~2100)的前10个闰年
    打印九九乘法表
    计算1~100之间所有整数的和
    循环执行
  • 原文地址:https://www.cnblogs.com/yhlx125/p/6854793.html
Copyright © 2011-2022 走看看