OSG点选事件的基类

原创 2015年07月09日 21:04:08

由于我的例子中有多处需要用到点选操作,我不想对一段代码到处复制粘贴,所以我写了一基类对点选操作进行管理。
其功能有:
1. 管理点选事件的添加和删除操作
2. 管理点选成功后Qt信号的发送
话不多数,上代码。
handleadapter.h

class HandleAdapter : public QObject
{
    Q_OBJECT

public:
    HandleAdapter(GraphicsView* view, QObject* parent = NULL);
    ~HandleAdapter();

    void benginHandle();
    void endHandle();

private slots:
    // 虚函数的实现,有其子类来
    virtual void slotPicked(osg::Vec3d pos){}
    virtual void slotMoveing(osg::Vec3d pos){}

    virtual void slotPickedXYZ(osg::Vec3d pos){}
    virtual void slotMoveingXYZ(osg::Vec3d pos){}

    virtual void slotRightHandle(){}

public:
    GraphicsView* m_pMap3D;
    osg::Group* m_pLayerGroup;
    PickHandle* m_pEventHandle;
};

功能实现如handleadapter.cpp

HandleAdapter::HandleAdapter(GraphicsView* view, QObject* parent/* = NULL*/)
    : m_pMap3D(view), QObject(parent)
{
    m_pLayerGroup = new osg::Group;
    m_pMap3D->getRoot()->addChild(m_pLayerGroup);

    m_pEventHandle = new PickHandle(m_pMap3D->getSRS());
}

HandleAdapter::~HandleAdapter()
{

}

void HandleAdapter::benginHandle()
{
    m_pMap3D->getOSGViewer()->addEventHandler(m_pEventHandle);
    connect(m_pEventHandle, SIGNAL(signalPicked(osg::Vec3d)), this, SLOT(slotPicked(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalMoving(osg::Vec3d)), this, SLOT(slotMoveing(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalRightPicked()), this, SLOT(slotRightHandle()));
    connect(m_pEventHandle, SIGNAL(signalPickedXYZ(osg::Vec3d)), this, SLOT(slotPickedXYZ(osg::Vec3d)));
    connect(m_pEventHandle, SIGNAL(signalMovingXYZ(osg::Vec3d)), this, SLOT(slotMoveingXYZ(osg::Vec3d)));
}

void HandleAdapter::endHandle()
{
    disconnect(m_pEventHandle, SIGNAL(signalPicked(osg::Vec3d)), this, SLOT(slotPicked(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalMoving(osg::Vec3d)), this, SLOT(slotMoveing(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalRightPicked()), this, SLOT(slotRightHandle()));
    disconnect(m_pEventHandle, SIGNAL(signalPickedXYZ(osg::Vec3d)), this, SLOT(slotPickedXYZ(osg::Vec3d)));
    disconnect(m_pEventHandle, SIGNAL(signalMovingXYZ(osg::Vec3d)), this, SLOT(slotMoveingXYZ(osg::Vec3d)));
    m_pMap3D->getOSGViewer()->removeEventHandler(m_pEventHandle);
}

好了,点选操作的基本功能就完善了,下面就可以开始进行功能性操作了。请看下一篇,画线。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

osg 学习 2 UpdateCallback, EventHandler, 运动的相机

下午读了《osg开源教程》 ,对callback, EventHandler 理解更好了点。晚上回来试试这两个例子。      callback 是单纯的场景内节点附属功能, 当遍历到某个附...

OSG获取鼠标点选事件的位置

OSG点选操作的思路是从osgGA::GUIEventHandler继承,并重新实现虚函数virtual bool handle(const osgGA::GUIEventAdapter& ea, o...
  • chlk118
  • chlk118
  • 2015年07月08日 22:13
  • 4461

OSG学习笔记13Pick点选物体

OSG鼠标单击点选事件的实现。单击牛模型后模型上的白线消失。

OSG学习笔记11 物体控制—对点选物体进行平移、缩放、旋转

使用鼠标点选当前场景中的物体,然后旋转、平移、缩放。 使用了两个自带的Dragger, TrackballDragger实现旋转,选中哪一个环就使物体沿哪个环渲染 TabBoxDragger:盒式拖曳...

OSG教程:场景保存基类ViewerBase

选自《OSG程序设计教程》第二章第四节     osgViewer::ViewerBase     类描述:是view的基本类,同时也是osgViewer::CompositeViewer和osg...

OSG学习笔记16 - 对点选物体平移(鼠标点选物体)(物体随鼠标移动)(屏幕坐标转世界坐标)

之前的一篇博文是有一篇对点选物体进行平移、缩放旋转。那一篇是很简单的调用了OSG中定义的一些dragger,但这些dragger都有坐标轴或者tapbox等在模型上,与我最近要做的事情的需求不同。网上...

技巧篇:如何重写基类的事件

先说说需求,也就是我们要达到的效果,希望扩展按钮控件,增加一些属性,但同时我们希望默认事件仍使用Click事件,不过,在事件参数中,我们希望能够传递更多的信息,而不是Button.Click默认的参数...
  • tcjiaan
  • tcjiaan
  • 2012年01月14日 21:26
  • 4020

【转】技巧篇:如何重写基类的onclick事件

先说说需求,也就是我们要达到的效果,希望扩展按钮控件,增加一些属性,但同时我们希望默认事件仍使用Click事件,不过,在事件参数中,我们希望能够传递更多的信息,而不是Button.Click默认的参数...

NGUI自定义事件(MonoBehaviour)&& 界面控件基类

自定义事件(MonoBehaviour),让它处理更多的事件 void OnHover (bool isOver) ? Sent out when the mouse hovers over th...
  • Momo_Da
  • Momo_Da
  • 2016年08月25日 12:11
  • 685
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG点选事件的基类
举报原因:
原因补充:

(最多只允许输入30个字)