1.void setFocus()
inline void setFocus() { setFocus(Qt::OtherFocusReason); }
void QWidget::setFocus(Qt::FocusReason reason)
{
if (!isEnabled())
return;
QWidget *f = d_func()->deepestFocusProxy();
if (!f)
f = this;
if (QApplication::focusWidget() == f)
return;
#if QT_CONFIG(graphicsview)
QWidget *previousProxyFocus = nullptr;
if (const auto &topData = window()->d_func()->extra) {
if (topData->proxyWidget && topData->proxyWidget->hasFocus()) {
previousProxyFocus = topData->proxyWidget->widget()->focusWidget();
if (previousProxyFocus && previousProxyFocus->focusProxy())
previousProxyFocus = previousProxyFocus->focusProxy();
if (previousProxyFocus == f && !topData->proxyWidget->d_func()->proxyIsGivingFocus)
return;
}
}
#endif
#if QT_CONFIG(graphicsview)
// Update proxy state
if (const auto &topData = window()->d_func()->extra) {
if (topData->proxyWidget && !topData->proxyWidget->hasFocus()) {
f->d_func()->updateFocusChild();
topData->proxyWidget->d_func()->focusFromWidgetToProxy = 1;
topData->proxyWidget->setFocus(reason);
topData->proxyWidget->d_func()->focusFromWidgetToProxy = 0;
}
}
#endif
if (f->isActiveWindow()) {
QWidget *prev = QApplicationPrivate::focus_widget;
if (prev) {
if (reason != Qt::PopupFocusReason && reason != Qt::MenuBarFocusReason
&& prev->testAttribute(Qt::WA_InputMethodEnabled)) {
QGuiApplication::inputMethod()->commit();
}
if (reason != Qt::NoFocusReason) {
QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, reason);
QCoreApplication::sendEvent(prev, &focusAboutToChange);
}
}
f->d_func()->updateFocusChild();
QApplicationPrivate::setFocusWidget(f, reason);
#ifndef QT_NO_ACCESSIBILITY
// menus update the focus manually and this would create bogus events
if (!(f->inherits("QMenuBar") || f->inherits("QMenu") || f->inherits("QMenuItem")))
{
QAccessibleEvent event(f, QAccessible::Focus);
QAccessible::updateAccessibility(&event);
}
#endif
#if QT_CONFIG(graphicsview)
if (const auto &topData = window()->d_func()->extra) {
if (topData->proxyWidget) {
if (previousProxyFocus && previousProxyFocus != f) {
// Send event to self
QFocusEvent event(QEvent::FocusOut, reason);
QPointer<QWidget> that = previousProxyFocus;
QCoreApplication::sendEvent(previousProxyFocus, &event);
if (that)
QCoreApplication::sendEvent(that->s
Qt框架中的焦点管理与键盘导航实现解析

本文详细介绍了Qt框架中关于焦点管理的几个关键函数:setFocus()用于设置焦点,clearFocus()清除焦点,setTabOrder()设置焦点顺序,setFocusProxy()指定焦点代理,以及focusNextChild()和focusPreviousChild()切换焦点。这些函数协同工作,确保了Qt应用程序中控件的焦点流动和键盘导航的正确性。
最低0.47元/天 解锁文章
554

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



