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类型 |
3.设置输入焦点
在某一时刻,只有一个控件(或根本没有)可以获得输入焦点。指定输入焦点可使用QWidget的下列方法:setFocus([reason]) - 如果控件在活动窗口中,调用此方法后,该控件成为输入焦点。reason参数可为QtCore.Qt类中的以下枚举变量:.
在监控系统中一般在视频实时预览的时候,希望提供一个悬浮工具条,可以显示一些提示信息比如分辨率、码率、帧率,提供一堆快捷操作按钮,可以录像、抓拍、云台控制、关闭等操作,参考了国内很多监控厂商客户端软件,总结下来基本就是悬浮条可以半透明悬浮在通道窗体上,也有少部分是固定嵌入在底部,个人觉得还是悬浮在顶部最为通用便捷,视频预览通道控件主要是用来预览的,应该尽量保证最大化的显示视频,所以采用悬浮的方式最佳,鼠标移动过去自动显示,移出去后自动隐藏,而且半透明的效果保证工具条出来的时候还能看到被遮住位置的画面。
事件处理机制 什么是事件,比如当我们打开一个窗口, 如果我们不动鼠标或者键盘, 那这个窗口就永远静静的躺着, 只有我们使用鼠标点击,或者键盘按下键的时候, 窗口才会有对应的反应。那么这个过程中就是用户向窗口发送了事件。 在 Qt 的界面应用程序都是事件驱动的,程序的每个动作也都是由某个事件所触发。在Qt 中事件抽象成QEvent类。 Qt中的事件有其对应的事件处理函数,事件先由QApplic...
Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点。基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中。当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并且软件必须尽量满足这种希望。系统必须确定击键定位在哪一个应用程序、应用程序中的哪一个窗口和窗口中的哪一个窗口部件。
1、焦点移动的方式
把焦点定位特殊的窗口部件的习惯方式有:
公有函数:
QKeyEvent ( Type type, int key, Qt::KeyboardModifiers modifiers, const QString & text = QString(), bool autorep = false, us
在某些时候在没有相应的鼠标事件时也需要获取鼠标按键
例如在处理失去焦点事件FocusOutEvent时reason()是MouseFocusReason,这时想知道是哪个鼠标按键触发的,就可以向下面这样做
//包含头文件
#include <QApplication>
//调用QApplication::mouseButtons()即可获得按下的哪个按键
qDebug()<<"which button"<<QApplication::mouseButtions();
项目场景:最近写了个Dialog界面,其中有两个SpinBox控件,监测SpinBox值变化时,重新执行计算,锁定了键盘输入,只响应键盘上下键和回车,但点击回车总是执行的清空数据方法。
通过设置Focus策略解决。