查看: 2182|回复: 5

如何继承osgGA::GUIEventHandler自定义handle

[复制链接]

该用户从未签到

发表于 2011-12-28 21:23:18 | 显示全部楼层 |阅读模式
目的:我想在现有程序基础上通过添加一个菜单项,实现一个鼠标点击查询功能,对话框显示查询信息,我通过addEventHandler来实现
出现问题:这个功能不是常用功能,我在不用的时候,应该如何取消?或者如何与已有的鼠标事件兼容?比方我原来可以通过鼠标旋转物体,用了addEventHandler后就只能实现查询了~~
谢谢@@
程序:
菜单函数
if (flag == m_coordsFlagAction->isChecked())
{
        m_coordsFlagAction->setChecked(true);
        return true;
}
else
{
        m_coordsFlagAction->setChecked(false);

                MapNode *mapNode = MapNode::findMapNode(m_centralOSGWidget->getSceneData());
        m_centralOSGWidget->addEventHandler( new MouseCoordsHandler(mouseCoords, mapNode->getMap()));
}

MouseCoordsHandler class:

struct MouseCoordsHandler : public osgGA::GUIEventHandler
{
        MouseCoordsHandler( LabelControl* label, const osgEarth::Map* map )
                : _label( label ),
                _map( map),
                _elevationQuery(map)
        {
                _elevationQuery.setMaxTilesToCache(10);
        }

        bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
        {
                osgViewer::View* view = static_cast<osgViewer::View*>(aa.asView());

                switch(ea.getEventType())
                {

                case osgGA::GUIEventAdapter:USH:
                        QMessageBox::information(0,QString("Attribute"),QString("test dialog"));
                        break;
                case osgGA::GUIEventAdapter::RELEASE:

                        break;
                case  osgGA::GUIEventAdapter::MOVE:
                        break;
                                default:
                        break;
                }

                return true;
                   }
        osg::ref_ptr< LabelControl > _label;
        const Map*                   _map;
        osgEarth::ElevationQuery _elevationQuery;
};
}

该用户从未签到

发表于 2011-12-29 08:50:39 | 显示全部楼层
不要return true

该用户从未签到

 楼主| 发表于 2011-12-29 11:21:14 | 显示全部楼层
我设置为return true 的时候 球体就不能动了,只能点击,弹出对话框
当我设置成return false的时候,好像鼠标和物体就咬合住了,在弹出的对话框上点击确定后,对话框消失,但鼠标好像一直点击在球体上没有释放(不知道表达明白了没~~

最后 ,当我不需要这个查询的时候,我应该怎么取消他

该用户从未签到

发表于 2011-12-29 12:07:12 | 显示全部楼层
不需要的时候从viewer里把eventhandle删除即可

该用户从未签到

 楼主| 发表于 2011-12-29 14:26:51 | 显示全部楼层
谢谢,用了add竟然不考虑有remove.
确实可以用removeEventHandler删除,但是在删除后的第一次点击前,鼠标还是像咬在上面~~~(鼠标左键没有持续按下,感觉像一直按下~~)需要再点击下鼠标才正常~
其次,在addEventHandler状态下不好实现兼容原有鼠标功能?
谢谢

该用户从未签到

发表于 2011-12-29 15:34:19 | 显示全部楼层
你所谓的咬住是因为鼠标松开消息你没有接收到,如果你是MFC窗口你可以设置你的渲染窗口监听鼠标消息来解决咬住的问题。
其次,兼容与否这完全取决于你的逻辑控制,不需要时你可以设置一个标志,如果你的事件处理器发现此标志则不进行事件处理!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表