键盘焦点
1. 获得焦点
设置小部件是否可以获得焦点,或以何种方式获得焦点。方式有两个:
- setFocus()函数被调用时,键盘焦点将会即时转移到该小部件下(如果小部件的直接或间接parent部件处于激活状态)。其带参数的重载函数setFocus(Qt::FocusReason reason)对是否获得焦点做了一个限定,必须满足reason的情况才可获得焦点(同时仍然需要满足小部件的直接或间接parent部件处于激活状态)。
- setFocusPolicy(Qt::FocusPolicy policy)函数用来设置什么样的操作可以获得焦点。这些“操作”通过枚举Qt::FocusPolicy来指定:
FocusPolicy::ClickFocus | 表示鼠标点击小部件时会获得焦点 |
FocusPolicy::TabFocus | 表示可通过Tab键切换可获得焦点 |
FocusPolicy::WheelFocus | 表示可通过鼠标滚轮切换获得焦点 |
FocusPolicy::NoFocus | 不可获得焦点(默认设置) |
2. 焦点代理
setFocusProxy()函数的作用是, 当前窗口接收到焦点时, 将交由指定的窗口来代理, 函数原型如下:
void QWidget::setFocusProxy(QWidget * w);
3. 清除焦点
clearFocus()函数负责即时清除小部件上的焦点(如果有的话)。
4. 焦点事件函数
focusInEvent()函数和focusOutEvent()函数在当前小部件获得焦点或失去焦点时自动被调用, 为虚函数。QFocusEvent 为其形参类型,QFocusEvent::reason()函数返回一个枚举类型Qt::FocusReason,该枚举用于表示小部件是以何种方式失去或得到的焦点。
一个focusInEvent()函数的重写示例如下:
virtual void focusInEvent(QFocusEvent * event)
{
switch (event->reason()) {
case Qt::FocusReason::MouseFocusReason:
cout << "焦点来自鼠标点击" << endl;
break;
case Qt::FocusReason::TabFocusReason:
cout << "焦点来自Tab键切换" << endl;
break;
case Qt::FocusReason::MenuBarFocusReason:
cout << "焦点来自菜单栏展开" << endl;
break;
case Qt::FocusReason::PopupFocusReason:
cout << "焦点来自窗口弹出" << endl;
break;
default:
break;
}
}
焦点事件QFocusEvent的reason()函数返回值是由用户调用焦点设置函数setFocus()或setFocus(Qt::FocusReason reason)决定的。
reason()函数返回值整理如下表:
用户调用的焦点设置函数 | reason()函数的返回值 |
---|---|
setFocus() | Qt::FocusReason::OtherFocusReason |
setFocusPolicy(Qt::FocusPolicy::ClickFocus) 或是其它FocusPolicy类型参数 | Qt::FocusReason::MouseFocusReason 或是其它与FocusPolicy参数对应的FocusReason类型参数 |
setFocus(Qt::FocusReason reason) | reason |
未调用任何焦点设置函数 | Qt系统自动判别FocusReason类型 |