在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件。
键盘事件派发给谁?
如何确定谁来接收键盘事件,不妨看一点点QApplication的源码:
X11下
QETWidget *keywidget=0;
bool grabbed=false;
if (event->type==XKeyPress || event->type==XKeyRelease) {
keywidget = (QETWidget*)QWidget::keyboardGrabber();
if (keywidget) {
grabbed = true;
} else if (!keywidget) {
if (d->inPopupMode()) // no focus widget, see if we have a popup
keywidget = (QETWidget*) (activePopupWidget()->focusWidget() ? activePopupWidget()->focusWidget() : activePopupWidget());
else if (QApplicationPrivate::focus_widget)
keywidget = (QETWidget*)QApplicationPrivate::focus_widget;
else if (widget)
keywidget = (QETWidget*)widget->window();

在Qt框架中,只有获得焦点的QWidget或抓取键盘的QWidget才能处理键盘事件。焦点分配遵循键盘grabber、活动弹出窗口、焦点Widget及窗口的顺序。Tab键切换焦点时,通过QWidget::focusNextPrevChild()确定焦点顺序,该函数可根据需求在派生类中覆盖。此外,使用setTabOrder()可定制焦点链表。对于包含大量按钮的Widget,如软键盘,利用focus proxy实现按键导航。
最低0.47元/天 解锁文章
997

被折叠的 条评论
为什么被折叠?



