如何禁用Qt在捕获窗口小部件焦点导航的箭头键的Linux上的行为

我正在开发一个主要在MacOS上开发的Qt应用程序,但是这个应用程序也是在Linux上构build和testing的。

我们在主窗口类中定义一个keyPressEvent()方法来响应某些键盘事件。 其中,我们响应Qt :: Key_Left,Qt :: Key_Right和Qt :: Key_Space。 这在MacOS上很好用。 然而,在Linux上,我们从来没有得到这些事件。

做一些谷歌search(并确认它与我们的应用程序在Linux上的行为),似乎这样做的原因是Qt使用这些键在应用程序的GUI中button窗口小部件的键盘导航。 如果我按下Linux上的箭头键,我将遍历所有活动的button小部件,依次select每个小部件。 如果我单击空格键,则按下当前选定的button。

到目前为止,Googlesearch所能find的所有build议都是关于如何将滤镜子类化或应用到特定button,以避免这种行为,方法是让button忽略事件并将其传递。 但是我不想为每个我放入GUI的button部件做这件事。 这只是跛脚。

有没有办法全局禁用这种行为,并允许我的应用程序代码实际上得到所有的箭头键和空格键事件?

Solutions Collecting From Web of "如何禁用Qt在捕获窗口小部件焦点导航的箭头键的Linux上的行为"

您可以设置添加全局事件侦听器来捕获这些事件。

在窗口构造函数中:

QApplication::instance()->installEventFilter(this); 

在窗口的eventFilter方法中:

 bool MainWindow::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent* key_event = static_cast<QKeyEvent*>(event); qDebug() << "key" << key_event->key() << "object" << object; //... } return false; } 

如果你已经处理了一个事件,你应该从这个函数返回true 。 您可以使用object变量来查找事件的来源。 例如,它可以是一些QPushButton。 你可以检查这个按钮是否是你主窗口的一个子窗口(如果你有多个顶窗)。

另一种方法是完全禁用按钮的焦点。 将按钮的focusPolicy设置为NoFocus 。 那么他们不会抓住关键事件。

您也可以继承QPushButton并用空实现重新实现keyPressEvent