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

我正在开发一个主要在MacOS上开发的Qt应用程序,但它也是在
Linux上构建和测试的.

我们在主窗口类中定义一个keyPressEvent()方法来响应某些键盘事件.其中,我们响应Qt :: Key_Left,Qt :: Key_Right和Qt :: Key_Space.这适用于MacOS.但是,在Linux上,我们从未得到过这些事件.

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

到目前为止,Googling所能找到的是关于如何子类化或将过滤器应用于特定按钮以避免此行为的建议,方法是让按钮忽略该事件并将其传递.但我不想为我放入GUI的每个按钮小部件执行此操作.那只是跛脚.

有没有办法全局禁用此行为并允许我的应用程序代码实际获取所有箭头键和空格键事件?

最佳答案 您可以设置添加全局事件侦听器以捕获这些事件.

在窗口构造函数中:

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.您可以使用对象变量来查找事件源.例如,它可以是一些QPushButton.如果有必要,您可以检查此按钮是否是主窗口的子项(如果您有多个顶窗).

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

您也可以将QPushButton子类化,并使用空实现重新实现keyPressEvent.

点赞