忽略OSG内Qt上的键盘按下

时间:2012-10-17 10:34:20

标签: qt keyboard openscenegraph

我是Qt的新手,遇到一个我无法处理的问题,比如一个月。情况是这样的: 我有OpenSceneGraph项目(这是OpenGL)并试图在3d场景中制作Qt接口。我认为没有必要我如何处理,但如果有人想知道更多here是关于OSG论坛的更多信息的线程(虽然我没有在那里得到解决方案)。问题是,当点击键盘上的任何键时,Qt控件在屏幕上跳转并且不再对任何(鼠标或键盘)事件做出反应。不过,整个计划仍在继续。 总而言之,我的问题是:有没有办法让Qt小部件忽略所有按键? 我搜索了很多,但找不到任何可行的解决方案。

提前致谢!

1 个答案:

答案 0 :(得分:2)

阅读一下events in Qt。有一个关于事件过滤的部分(但请不要直接跳到它:P)。

简短回答:

void Qwidget::setEnabled ( bool );

缺点是它也会禁用鼠标事件,更改窗口小部件样式,这是一个无赖。

长期回答:过滤事件

一种可能性是过滤Qt应用程序上的所有事件。我想启动你的Qt代码的功能看起来像这样(如果这里有不同的帖子):

int main(int argc, char* argv[]){
    QApplication app(argc, argv);
    QWidget toplevelwidget1;
    toplevelwidget1.show()
    //stufff
    return app.exec();
} 
//doesnt have to exactly like this.

您可以在app变量上set an event filter。这是更优雅的解决方案,但它过于复杂,因为它过滤原生事件,需要一些工作......

您可以执行的操作仅过滤您的顶级窗口小部件或窗口(没有父项的窗口)。您可以定义一个事件过滤器(QObject),如:

class KeyboardFilter: public QObject
{
   Q_OBJECT
   ...

   protected:
     bool eventFilter(QObject *obj, QEvent *event);
 };

  bool KeyboardFilter::eventFilter(QObject *obj, QEvent *event)
  {
      //for all events from keyboard, do nothing
      if (event->type() == QEvent::KeyPress || 
          event->type() == QEvent::KeyRelease ||
          event->type() == QEvent::ShortcutOverride ||
          ) {
          return true;
      } else {
        // for other, do as usual (standard event processing)
        return QObject::eventFilter(obj, event);
      }
  }

然后使用以下方法在所需的小部件上设置过滤器:

 myDesiredWidgetorObject->installEventFilter(new KeyboardFilter(parent));

就是这样!