Qt中控件可能拦截事件处理

问题现象:一个Qt对话框(QDialog),仅放置了一个QListWidget列表控件,要求使用数字键控制列表中选定项的改变和移动。运行时发现按键无响应,断点显示keyPressEvent()函数正常执行,打印键码(QKeyEvent::key())发现为异常值(如按下数字键5(对应Qt::Key_5, 0x35, 53),得到的键码为Alt(对应Qt::Key_5, 0x01000023, 16777251等))。

处理:运行时发现列表控件具有焦点并拦截了按键事件,将QListWidget列表控件的FocusPolicy属性设为NoFocus后问题解决。

此外,如果有控件调用了QWidget::grabKeyboard()函数,将导致所有控件上的按键事件被该控件拦截,直到QWidget::releaseKeyboard()函数被调用为止。

参考资料:

https://doc.qt.io/archives/qt-4.8/qkeyevent.html

https://doc.qt.io/archives/qt-4.8/qt.html#Key-enum

https://doc.qt.io/archives/qt-4.8/qwidget.html#grabKeyboard

it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License