忽略OSG内Qt上的键盘按下

忽略OSG内Qt上的键盘按下,qt,keyboard,openscenegraph,Qt,Keyboard,Openscenegraph,我是Qt的新手,遇到了一个我一个月都无法处理的问题。情况是这样的: 我有一个OpenSceneGraph项目(它是OpenGL),并试图在3d场景中创建Qt接口。我认为我没有必要去处理这个问题,但如果有人想知道更多的是OSG论坛上的更多信息(尽管我没有得到解决方案)。问题是,当点击键盘上的任何键时,Qt控件在屏幕上跳跃,不再对任何(鼠标或键盘)事件做出反应。不过,整个计划仍在继续。 总之,我的问题是:有没有办法让Qt小部件忽略所有按键? 我找了很多,但找不到有效的解决办法 提前谢谢 读一点关于。

我是Qt的新手,遇到了一个我一个月都无法处理的问题。情况是这样的: 我有一个OpenSceneGraph项目(它是OpenGL),并试图在3d场景中创建Qt接口。我认为我没有必要去处理这个问题,但如果有人想知道更多的是OSG论坛上的更多信息(尽管我没有得到解决方案)。问题是,当点击键盘上的任何键时,Qt控件在屏幕上跳跃,不再对任何(鼠标或键盘)事件做出反应。不过,整个计划仍在继续。 总之,我的问题是:有没有办法让Qt小部件忽略所有按键? 我找了很多,但找不到有效的解决办法

提前谢谢

读一点关于。有一节是关于事件过滤的(但请不要直接跳到:P)

简短回答:

缺点是它还禁用鼠标事件,更改小部件样式,这是一个麻烦

长回答:筛选事件

一种可能性是过滤Qt应用程序上的所有事件。我假设启动Qt代码的函数如下所示(如果此处的帖子不同):

您可以在
app
variable上进行设置。这是一个更优雅的解决方案,但它太复杂了,因为它过滤本机事件,并且需要一些工作

您可以做的是只过滤顶级小部件或窗口(没有父窗口的窗口)。您可以定义一个事件筛选器(它是
QObject
),如下所示:

然后使用以下命令在所需小部件上设置过滤器:

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

就这样

谢谢你的快速回答。我读了这篇文章,并尝试了你的“长答案”解决方案。虽然它不起作用,但可能我遗漏了一些东西:你的类内声明中的“…”是什么意思?还有一件事,“新键盘过滤器(父项)”为什么会有父项,如果它是用于没有父项的小部件的话还有一件事也困扰着我:按键使小部件跳转到屏幕的一个位置,而不仅仅是模拟的,而是一个接一个的(一个点击按钮跳转,另一个点击其他按钮跳转到上一个)。无论如何,谢谢你的回答,至少我现在有些东西要学!没用?我提出了一个解决方案的想法,而不是直接编译和工作的东西。。。一个解决方案是保守,在您创建的所有小部件上使用此过滤器,而不管是否为顶层。它应该起作用。
只是一种说废话的方式。2) 父对象是一个单独的概念,
KeyboardFilter
是QObject的子类,因此他可以有一个父对象。现在,如果需要,可以将其设置为null,但这取决于您的代码。这些小部件是否有父部件与此无关。。。3) 这些
按钮跳转
真的很奇怪,没有看到源代码就说不出任何信号。有趣的事实是:即使我设置widget->setEnabeled(false),然后单击键盘按钮,仍然是相同的错误。所以我不认为我能用widget做的任何事情都会有帮助。
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));