查看: 5174|回复: 14

Qt Widget和osgViewer结合 失去GUIEventAdapter::MOVE事件

[复制链接]

该用户从未签到

发表于 2012-12-21 12:06:15 | 显示全部楼层 |阅读模式
我使用QWidget和osgViewer作为一个显示窗口,给它绑定一个摄像机操纵器m,正常情况下,窗口内的鼠标操作和键盘操作都可在m的handle(ea,us)中处理,但是,我弹出一个Qt对话框(点击关闭或者确定、取消)之后,handle里面的MOVE事件和键盘相关的事件都不处理了。调试发现,ea里面的_button和_buttonMask有些不正常了,例如我点击的是鼠标右键,-button=4,但是_buttonMask=1,我想是我在点击那个Qt对话框的“OK”按钮的时候,将_buttonMask设置成了1,然后就不再改变了。但是为什么连MOVE动作都给屏蔽了呢??

该用户从未签到

发表于 2012-12-21 12:23:35 | 显示全部楼层
这个应该要重新捕获吧

该用户从未签到

 楼主| 发表于 2012-12-21 12:41:03 | 显示全部楼层
bigboy 发表于 2012-12-21 12:23
这个应该要重新捕获吧

具体怎么重新捕获,可否告诉用到那几个函数或者类?多谢

该用户从未签到

发表于 2012-12-21 13:02:48 | 显示全部楼层
wanggang8826 发表于 2012-12-21 12:41
具体怎么重新捕获,可否告诉用到那几个函数或者类?多谢

得到窗口句柄,MFC是SetForcus()和SetCapture(),QT就不知道了,应该差不多吧

该用户从未签到

 楼主| 发表于 2012-12-21 13:55:20 | 显示全部楼层
bigboy 发表于 2012-12-21 13:02
得到窗口句柄,MFC是SetForcus()和SetCapture(),QT就不知道了,应该差不多吧

多谢。我尝试了,我把Qt窗口setfocus了还是不行。看来不是Qt窗口的事情,我觉得是OSG什么地方出了问题。

我是在鼠标拾取场景中一个物体后,弹出一个Qt对话框,然后点击(只能鼠标左键)“OK”按钮,然后就出现了上述情况,即handle(ea,us)不执行MOVE动作和键盘的KEY_UP之类的动作了。
如果我不弹出那个对话框,程序没有任何问题。

我尝试重写Qt QWidget(窗口)的相关鼠标事件处理函数,也不会执行。。。

该用户从未签到

发表于 2012-12-21 16:10:15 | 显示全部楼层
跟OSG有什么关系,就是你的消息没有传递到osg的EventQueue 自己查找原因吧

该用户从未签到

 楼主| 发表于 2012-12-21 16:22:28 | 显示全部楼层
liuzhiyu123 发表于 2012-12-21 16:10
跟OSG有什么关系,就是你的消息没有传递到osg的EventQueue 自己查找原因吧

我找了很久了,决定放弃这个对话框了。也不是所有的消息都没传递到EventQueue,比如Push,Release,Scrool都可以相应,就是MOVE不可以

该用户从未签到

发表于 2012-12-21 16:25:22 | 显示全部楼层
wanggang8826 发表于 2012-12-21 16:22
我找了很久了,决定放弃这个对话框了。也不是所有的消息都没传递到EventQueue,比如Push,Release,Scrool都 ...

我这里使用没有任何问题,哈哈

该用户从未签到

 楼主| 发表于 2012-12-21 16:33:17 | 显示全部楼层
我在主窗口中弹出对话框也没问题,现在出问题的QWidget是主窗口QMainWindow的一个子窗口,就不行了。多谢你的回答。

该用户从未签到

发表于 2012-12-21 19:26:50 | 显示全部楼层
wanggang8826 发表于 2012-12-21 13:55
多谢。我尝试了,我把Qt窗口setfocus了还是不行。看来不是Qt窗口的事情,我觉得是OSG什么地方出了问题。
...

不是拿TQ窗口setfocus,是要获得你切入osgViewer的窗口的hwnd。这样osg才能获取焦点

该用户从未签到

发表于 2012-12-22 16:23:58 | 显示全部楼层
我所知甚少,希望对你有帮助。
撇开osg不谈,我记得QT的mousemove事件默认不触发,需要代码指定才触发。

该用户从未签到

发表于 2012-12-24 08:19:23 | 显示全部楼层
确实是,需要开启setMouseTracking(true)

该用户从未签到

 楼主| 发表于 2012-12-24 09:17:17 | 显示全部楼层
chworm 发表于 2012-12-22 16:23
我所知甚少,希望对你有帮助。
撇开osg不谈,我记得QT的mousemove事件默认不触发,需要代码指定才触发。

我是在Qt Designer中布局窗口的,参照你和liuzhiyu123的提示,我把出问题的那个窗口的mouseTracking选项勾上了,也就相当于使用了setMouseTracking(true)了吧。还是有问题,可能是我程序中其他地方问题所致。我现在绕过这个问题,将弹出的对话框设置成非模态的,这样暂时可以避开此问题。谢谢你的回答。

该用户从未签到

发表于 2017-9-12 10:09:41 | 显示全部楼层
这个问题不是屏蔽了Move事件,而是你的鼠标右键弹出窗口之后,在窗口关闭之后,这个右键像是一直被按下去了,导致你的Move事件变成了一个Drag右键的事件,当然就不会响应Move事件了。但是至于怎么解决这个问题我暂时也没有找到好的方法。

该用户从未签到

发表于 2017-9-13 10:23:43 | 显示全部楼层
我自己测试了一下,这个问题可能是OSG在封装事件的时候没有处理正确。把弹框的事件放在Qt事件中去处理就正常了,上传部分参考代码,方便被类似问题折磨的读者:(不要在EventHandler事件处理中去弹框,而是在Qt的事件中弹框)
  1.                 if (event->type() == QEvent::MouseButtonPress)
  2.                 {
  3.                         QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
  4.                         if (mouseEvent->button() == Qt::RightButton)
  5.                         {
  6.                                 emit rightButtonClickedSignal();
  7.                                 return true;
  8.                         }
  9.              }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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