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

如何禁用Qt';在Linux上为小部件焦点导航捕获箭头键的行为,linux,qt,events,keyboard,Linux,Qt,Events,Keyboard,我正在开发一个主要在MacOS上开发的Qt应用程序,但它也在Linux上构建和测试 我们在主窗口类中定义一个keyPressEvent()方法来响应某些键盘事件。其中,我们响应Qt::Key_Left、Qt::Key_Right和Qt::Key_Space。这在MacOS上非常有效。然而,在Linux上,我们从未得到这些事件 通过谷歌搜索(并确认我们的应用程序在Linux上的行为),这似乎是因为Qt使用这些键在应用程序GUI中的按钮小部件的键盘导航。如果我在Linux上按箭头键,我将遍历所有活动

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

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

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

到目前为止,我通过谷歌搜索所能找到的只是关于如何对特定按钮进行子类化或应用过滤器的建议,通过让按钮忽略事件并传递它来避免这种行为。但我不想对我放入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;
}
bool主窗口::事件过滤器(QObject*对象,QEvent*事件){
如果(事件->类型()==QEvent::按键){
QKeyEvent*key_事件=静态_转换(事件);

qDebug()您能确认Qt:Key\u PageUp Qt::Key\u PageDown的情况也是如此吗?