Qt 焦点系统关键点总结

作者 : admin 本文共1193个字,预计阅读时间需要3分钟 发布时间: 2024-06-17 共1人阅读

1.1 焦点窗口

指的是当前时刻拥有键盘输入的窗口。

Qt提供了如下接口,用于设置窗口是否是”可获取焦点“窗口:

void QWidget::setFocusPolicy(Qt::FocusPolicy policy);
Qt::FocusPolicy      
Qt::TabFocus      与焦点链相关,详解见下一小节
Qt::ClickFocus      
Qt::StrongFocus
Qt::WheelFocus    
Qt::NoFocus      不可获取焦点

setFocusPolicy()的参数值可以是上述5个值中的任意一种,当参数值为前4个的时候,当前窗口可以获取焦点,当参数值为Qt::Nofocus的时候,当前窗口不可获取焦点。

1.2 焦点链

Qt除了把窗口对象组织成树状结构外,还把这些窗口组织成了一个双向链表结构,这个链表叫做焦点链。焦点链上每个节点代表一个窗口,默认情况下,窗口在焦点链上的先后位置,与用户把窗口添加到窗口树的先后顺序有关,越早添加到窗口树上的窗口,其在焦点链中的位置越靠前。

通过按Tab或者Shift+Tab,可以实现焦点在各个窗口之间循环移动。焦点移动顺序与焦点链相关,它的移动规律如下:

1)点击Tab键,焦点链指针向后移动,直至碰到第一个FocusPolicy为TabFocus的窗口,并设置该窗口为焦点窗口;

2)点击Shift+Tab,焦点链指针向前移动,直至碰到第一个FocusPolicy为TabFocus的窗口,并设置该窗口为焦点窗口;

Qt提供了下列结构,用于获取焦点链信息:

//返回此部件焦点链中的下一个部件
QWidget* QWidget::nextInFocusChain() const;
//返回此部件焦点链中的前一个部件
QWidget* QWidget::previousInFocusChain() const;

此外,我们还可以调整焦点链中节点的先后顺序

// 将焦点顺序中的部件 second 放置在部件 first 之后
static void QWidget::setTabOrder(QWidget* first, QWidget* second);

比如,若默认的焦点链顺序为 a-b-c-d,则:

setTabOrder(d,c); //改变后焦点链的顺序为 a-b-d-c
setTabOrder(b,a); //改变后焦点链的顺序为 b-a-d-c

1.3 焦点事件

与焦点事件处理相关的函数如下:

void QWidget::focusInEvent(QFocusEvent *event);
void QWidget::focusOutEvent(QFocusEvent *event);

当焦点从一个部件移动到另一个部件时,会触发QFocusEvent事件,这个事件会被发送给原焦点窗口和当前焦点窗口,原焦点窗口执行focusOutEvent(),新焦点窗口执行focusInEvent()

本站无任何商业行为
个人在线分享 » Qt 焦点系统关键点总结
E-->