2

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

提前致谢!

4

1 回答 1

2

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

简短的回答:

无效 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这是更优雅的解决方案,但它太复杂了,因为它过滤原生事件并且需要一些工作......

相反,您可以做的是仅过滤您的顶级小部件或窗口(没有父级的窗口)。您定义一个事件过滤器(它是 a 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));

就是这样!

于 2012-10-17T11:06:08.440 回答