查看: 2886|回复: 17

osgQt结合后键盘的事件响应问题

[复制链接]

该用户从未签到

发表于 2010-4-13 16:43:37 | 显示全部楼层 |阅读模式
  1. void OsgWidget::keyPressEvent( QKeyEvent* event )
  2. {
  3. _gw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) * (event->text().toAscii().data()));
  4. }
复制代码

我重写的handle()如下:

  1. class PickModeHandler : public osgGA::GUIEventHandler
  2. {
  3. public:
  4. enum Modes
  5. {
  6.   VIEW = 0,
  7.   PICK
  8. };
  9. PickModeHandler():
  10.   _mode(VIEW),
  11.   _activeDragger(0)
  12.   {
  13.   }        
  14.   bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa,
  15.    osg::Object*, osg::NodeVisitor*)
  16.   {
  17.    osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
  18.    if (!view) return false;
  19.    if (ea.getKey() == osgGA::GUIEventAdapter::KEY_F1 &&
  20.     ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN &&
  21.     _activeDragger == 0)
  22.    {
  23.     _mode = ! _mode;
  24.    }
  25.    if (ea.getKey()=='D')
  26.    {
  27.     QMessageBox msgBox;
  28.     msgBox.setText("hello");
  29.     msgBox.exec();
  30.    }
  31. }
  32. }
复制代码

调用是在osgInit()中:

  1. _viewer.addEventHandler(new PickModeHandler());
复制代码

我遇到的问题是不能进行键盘响应:即我按下“D”键后没有反应,设置断点也不会中断。请问我的程序有问题吗?

该用户从未签到

发表于 2010-4-13 16:49:31 | 显示全部楼层
首先请使用handle(ea, aa),而不是四个参数的那个;后者是系统内部调用的

之后,最好的方法就是打印一下_gw->getEventQueue()->keyPress的值,看一看是否传入了'D'的按键,然后再进一步分析是哪里出现了问题。

该用户从未签到

 楼主| 发表于 2010-4-13 17:20:45 | 显示全部楼层
首先请使用handle(ea, aa),而不是四个参数的那个;后者是系统内部调用的

之后,最好的方法就是打印一下_gw->getEventQueue()->keyPress的值,看一看是否传入了'D'的按键,然后再进一步分析是哪里出现了问题。
array 发表于 2010-4-13 16:49


我的这个handle是直接复制osg例子osgmanipulator来的,他那里就使用的是四个参数的。
我再弱弱的问一句:请问怎么打印_gw->getEventQueue()->keyPress的值?谢谢!

该用户从未签到

发表于 2010-4-14 08:15:29 | 显示全部楼层
我再弱弱的问一句:请问怎么打印_gw->getEventQueue()->keyPress的值

您会被这种问题难住?Qt自带的qDebug,QMessageBox,或者用标准库的cout,ofstream,甚至古老的printf,都可以实现您的要求

该用户从未签到

 楼主| 发表于 2010-4-14 09:49:42 | 显示全部楼层
您会被这种问题难住?Qt自带的qDebug,QMessageBox,或者用标准库的cout,ofstream,甚至古老的printf,都可以实现您的要求
array 发表于 2010-4-14 08:15

您误会了,我的意思是怎么get这个值?

该用户从未签到

发表于 2010-4-14 10:19:57 | 显示全部楼层
(osgGA::GUIEventAdapter::KeySymbol) * (event->text().toAscii().data())

您要打印的不就是这个值吗?

该用户从未签到

 楼主| 发表于 2010-4-14 16:53:10 | 显示全部楼层
  1. void OsgWidget::keyPressEvent( QKeyEvent* event )
  2. {
  3.         _gw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) * (event->text().toAscii().data()));
  4.         QMessageBox msgBox;
  5.         msgBox.setText(QString::number(event->key()));
  6.         msgBox.exec();
  7. }
复制代码
我是这样子写的,键值都能获得,说明就是osg的问题,可是下一步该怎么检查呢?

该用户从未签到

 楼主| 发表于 2010-4-14 17:02:48 | 显示全部楼层
  1. void OsgWidget::keyPressEvent( QKeyEvent* event )
  2. {
  3.         _gw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) * (event->text().toAscii().data()));
  4.         QMessageBox msgBox;
  5.         msgBox.setText(QString::number((osgGA::GUIEventAdapter::KeySymbol) * (event->text().toAscii().data())));
  6.         msgBox.exec();
  7. }
复制代码
这样子的话按a-z是可以输出值,但是f1-f12,和一些功能键,输出的全部是0.
什么原因呢?为什么我的handle()中的
  1. if (ea.getKey()=='D')

  2.    {

  3.     QMessageBox msgBox;

  4.     msgBox.setText("hello");

  5.     msgBox.exec();

  6.    }

复制代码
没有反应呢?

该用户从未签到

发表于 2010-4-14 17:12:31 | 显示全部楼层
检查您的handle()函数是否能进入

该用户从未签到

 楼主| 发表于 2010-4-14 17:22:31 | 显示全部楼层
检查您的handle()函数是否能进入
array 发表于 2010-4-14 17:12

能进入

该用户从未签到

 楼主| 发表于 2010-4-14 17:27:51 | 显示全部楼层
我在osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);设置断点,可以中断。

该用户从未签到

发表于 2010-4-14 17:54:45 | 显示全部楼层
qt的功能键的键值和OSG是不同的,可能需要转换一下。

        if( event->key() == Qt::Key_Alt )
        {
                // for qt:alt-left
                _gw->getEventQueue()->keyPress( 0xFFE9 ) ;
        }

该用户从未签到

 楼主| 发表于 2010-4-14 18:17:27 | 显示全部楼层
qt的功能键的键值和OSG是不同的,可能需要转换一下。

        if( event->key() == Qt::Key_Alt )
        {
                // for qt:alt-left
                _gw->getEventQueue()->keyPress( 0xFFE9 ) ;
        }
akingbr 发表于 2010-4-14 17:54

但是为什么会连字母“D”也不能响应呢?
我总结一下我的问题:
1.handle()中写的ea.getkey()不能响应;
2.对功能键的键值获取结果为0。

该用户从未签到

发表于 2010-4-15 08:46:46 | 显示全部楼层
既然您能够进入handle()函数,那么您现在需要监测的是:每次刚刚进入handle时ea.getKey()的值是什么,并据此判断Qt传入的键值是否与OSG的键值以及'D'的数值有偏差(功能键的获取值是肯定不一样的,可以使用akingbr的方法,也可以自己写转换的代码)。这完全可以通过非常简单的跟踪来完成,并且也可以帮助我们定位您的代码的问题所在。

另一个可能性:您按下键盘上的字母'D'时,是否确信是按下了大写字母?即,shift+d。

该用户从未签到

 楼主| 发表于 2010-4-15 09:54:15 | 显示全部楼层
既然您能够进入handle()函数,那么您现在需要监测的是:每次刚刚进入handle时ea.getKey()的值是什么,并据此判断Qt传入的键值是否与OSG的键值以及'D'的数值有偏差(功能键的获取值是肯定不一样的,可以使用akingbr的 ...
array 发表于 2010-4-15 08:46

之前不能响应“D”是因为大小写的原因,现在已经可以响应了。qt中“d”是68,而osg中是100。
谢谢大家!

该用户从未签到

发表于 2010-4-15 10:20:27 | 显示全部楼层

该用户从未签到

发表于 2010-11-6 02:05:01 | 显示全部楼层
学习啊!!

该用户从未签到

发表于 2011-3-29 17:48:51 | 显示全部楼层
能否把按键的事件通过按钮来操作?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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