忽略OSG内Qt上的键盘按下
我是Qt的新手,遇到了一个我一个月都无法处理的问题。情况是这样的: 我有一个OpenSceneGraph项目(它是OpenGL),并试图在3d场景中创建Qt接口。我认为我没有必要去处理这个问题,但如果有人想知道更多的是OSG论坛上的更多信息(尽管我没有得到解决方案)。问题是,当点击键盘上的任何键时,Qt控件在屏幕上跳跃,不再对任何(鼠标或键盘)事件做出反应。不过,整个计划仍在继续。 总之,我的问题是:有没有办法让Qt小部件忽略所有按键? 我找了很多,但找不到有效的解决办法 提前谢谢 读一点关于。有一节是关于事件过滤的(但请不要直接跳到:P) 简短回答: 缺点是它还禁用鼠标事件,更改小部件样式,这是一个麻烦 长回答:筛选事件 一种可能性是过滤Qt应用程序上的所有事件。我假设启动Qt代码的函数如下所示(如果此处的帖子不同): 您可以在忽略OSG内Qt上的键盘按下,qt,keyboard,openscenegraph,Qt,Keyboard,Openscenegraph,我是Qt的新手,遇到了一个我一个月都无法处理的问题。情况是这样的: 我有一个OpenSceneGraph项目(它是OpenGL),并试图在3d场景中创建Qt接口。我认为我没有必要去处理这个问题,但如果有人想知道更多的是OSG论坛上的更多信息(尽管我没有得到解决方案)。问题是,当点击键盘上的任何键时,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));