首先来说说为什么要设置焦点吧。
设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。
一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab 键、不接受焦点事件等)。用如下函数
void
|
setFocusPolicy
( Qt::FocusPolicy
policy
)
|
设置获得焦点的方式:
Constant
|
Value
|
Description
|
Qt::TabFocus
|
0x1
|
通过Tab键获得焦点
|
Qt::ClickFocus
|
0x2
|
通过被单击获得焦点
|
Qt::StrongFocus
|
TabFocus | ClickFocus | 0x8
|
可通过上面两种方式获得焦点
|
Qt::WheelFocus
|
StrongFocus | 0x4
|
类似Qt::StrongFocus只不过再加上鼠标滑轮
|
Qt::NoFocus
|
0
|
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点.
|
当前有焦点事件的窗口只能有一个,当一个窗口获取焦点事件或失去焦点事件时,可能需要相应的操作,或者如何判断一个才窗口有没有焦点事件。Qt中亦有相应的函数。
void QWidget::focusInEvent ( QFocusEvent * event ) [virtual protected]
void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]
这两个就是窗口获取或失去焦点事件的函数,需要我们重写(好多窗口都是从 QWidget 继承这两个函数的)
bool hasFocus () const
这个函数就是判断当前窗口有没有焦点事件的,返回布尔值。
void QWidget::setFocus ( Qt::FocusReason reason )
void QWidget::clearFocus ()
这两个函数就是设置或清除焦点事件的。
Constant
|
Value
|
Description
|
Qt::TabFocus
|
0x1
|
the widget accepts focus by tabbing.
|
Qt::ClickFocus
|
0x2
|
the widget accepts focus by clicking.
|
Qt::StrongFocus
|
TabFocus | ClickFocus | 0x8
|
the widget accepts focus by both tabbing and clicking. On Mac OS X this will also be indicate that the widget accepts tab focus when in 'Text/List focus mode'.
|
Qt::WheelFocus
|
StrongFocus | 0x4
|
like Qt::StrongFocus plus the widget accepts focus by using the mouse wheel.
|
Qt::NoFocus
|
0
|
the widget does not accept focus.
|
转载于:
Qt焦点事件 - 心灵捕手 - 博客园 (cnblogs.com)
(SAW:Game Over!)
原文链接:
https://www.cnblogs.com/Dennis-mi/articles/5231465.html
朱艳荺,殷廷瑞(西安电子科技大学信息与控制工程研究所,陕西 西安 710071)
QT
是奇趣科技推出的一种多平台的C++图形用户界面应用程序框架。它包括
QT
开发库
QT
Library、快速开发工具
QT
Designer、国际化工具
QT
Linguist以及开发助手
QT
Assistant,由于其可移植性好,而且完全面向对象,很容易扩展,因此,
QT
已成为众多嵌人式厂家选择的热点工具。
1 操作系统选择
本文主要讨论的是一个可变情报板控制器的图形界面系统。该系统需要用串口和以太网口两路来和主控PC和LED情报板通讯,所以,硬件上选择的是一款采用SAMSUNGS
Qt
事件
模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的
事件
。
让我们试着设想已经有了一个CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 现在,我们想用空格键来代替Tab,使
焦点
在这些QLineEdit间切换。
一个解决的方法是子类化QLineEdit,重新实现keyPressEvent(),并在keyPressEvent()里调用focusNextChild()。像下面这样:
void MyLineEdit::keyPressEvent(QKeyEvent *event)
if (event->key() ==
Qt
::Key_Space) {
focusNextChild();
} else {
QLineEdit::keyPressEvent(event);
但这有一个缺点。如果CustomerInfoDialog里有很多不同的控件(比如QComboBox,QEdit,QSpinBox),我们就必须子类化这么多控件。这是一个烦琐的任务。
一个更好的解决办法是: 让CustomerInfoDialog去管理他的子部件的按键
事件
,实现要求的行为。我们可以使用
事件
过滤器。
一个
事件
过滤器的安装需要下面2个步骤:
1, 调用installEventFilter()注册需要管理的对象。
2,在eventFilter() 里处理需要管理的对象的
事件
。
一般,推荐在CustomerInfoDialog的构造函数中注册被管理的对象。像下面这样:
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent) : QDialog(parent){ ...
firstNameEdit->installEventFilter(this);
lastNameEdit->installEventFilter(this);
cityEdit->installEventFilter(this);
phoneNumberEdit->installEventFilter(this);
一旦,
事件
管理器被注册,发送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit的
事件
将首先发送到eventFilter()。
下面是一个 eventFilter()函数的实现:
bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
if (target == firstNameEdit || target == lastNameEdit
|| target == cityEdit || target == phoneNumberEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() ==
Qt
::Key_Space) {
focusNextChild();
return true;
return QDialog::eventFilter(target, event);
在上面的函数中,我们首先检查目标部件是否是 firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit。接着,我们判断
事件
是否是按键
事件
。如果
事件
是按键
事件
,我们把
事件
转换为QKeyEvent。接着,我们判断是否按下了空格键,如果是,我们调用focusNextChild(),把
焦点
传递给下一个控件。然后,返回,true通知
Qt
,我们已经处理了该
事件
。
如果返回false的话,
Qt
继续将该
事件
发送给目标控件,结果是一个空格被插入到QLineEdit中。
如果目标控件不是 QLineEdit,或者按键不是空格键,我们将把
事件
传递给基类的eventFilter()函数。
Qt
提供5个级别
朱艳荺,殷廷瑞(西安电子科技大学信息与控制工程研究所,陕西 西安 710071)
QT
是奇趣科技推出的一种多平台的C++图形用户界面应用程序框架。它包括
QT
开发库
QT
Library、快速开发工具
QT
Designer、国际化工具
QT
Linguist以及开发助手
QT
Assistant,由于其可移植性好,而且完全面向对象,很容易扩展,因此,
QT
已成为众多嵌人式厂家选择的热点工具。
1 操作系统选择
本文主要讨论的是一个可变情报板控制器的图形界面系统。该系统需要用串口和以太网口两路来和主控PC和LED情报板通讯,所以,硬件上选择的是一款采用SAMSUNGS
该实例程序使用
Qt
进行,windows的键盘后台监听,即使
Qt
桌面程序失去
焦点
在后台运行,也会捕捉到按键
事件
这个程序使用windows的钩子(hook)实现的,
Qt
官方没有相关的实现
关于编译,我用的是
Qt
5.9.7 MinGW32位,我还用了
Qt
5.6.3MinGW32位,也变过去了,
更换编译环境时候可能会报错,这些问题请百度
我遇到过声明的函数提示已经声明了,我就声明了一次,没办发, 把声明去了,就去可以正常便过去了
还有使用windows系统库的时候可能会链接不上,在*.pro文件里面添加windows系统库就好了
列如: LIBS += -Lc:/xx/xx -lUser32
不要想着别人的代码拿过来就能跑起来,先解决编译问题,这也是在不断地积累
Qt
获得和失去
焦点
事件
(Focus
事件
)1.重写控件的focusInEvent()和focusOutEvent()函数针对一个窗口上的多个可编辑控件(比如QLineEdit、
QT
extEdit等),我们希望控件在获得
焦点
之后能够和其他的控件有区别,如果想实现这一功能,就要用到focusInEvent()和focusOutEvent()函数。查看了官方文档,可以在子类中重写这两个函数来实现我们的目的...
qt
默认点击
事件
中,点击widget时,默认调用focusInEvent函数,也就是
qt
的
焦点
事件
。当你点击
qt
widget窗口时,自动调用focusInEvent函数,在该函数内部自动调用update()函数,可能会在你不想刷新的时候进行刷新,从而造成一些问题。
想要取消这一特性,需要重写focusInEvent函数,代码如下:
源码参见:
Qt
\6.2.2\Src\
qt
base\src\widgets\widgets\qabstractbutton.cpp第991行
void QAbstractButt
描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、
QT
extEdit等),当哪个控件获得
焦点
,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEvent()和focusOutEvent(), 在实际过程中,我犯了十分严重的错误,最开始的时候我是这样做的:我重写了窗体QWidget的这两个函数,然后再在函数体中把QFocusEve
开发过程中发现,在
QT
ableView获得
焦点
时,按键无法响应,经过几番分析查找发现,
QT
ableVew位于子窗口中,而且其本身会接受按键
事件
。因此在
QT
ableView获得
焦点
时,按键点击并不会触发主窗口的keyPressEvent()函数。解决的办法是设置该
QT
ableVew的focusPolicy()属性,让其不处理按键
事件
。具体实现:ui.tableView.setFocusPolicy(
今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查
焦点
问题,以及tab键的
焦点
调转顺序。
首先要感谢这篇文章:【
QT
】新弹窗默认无
焦点
给了我一个思路,我能不能在窗口show出来之后,或者show
事件
中知道当前的focus在哪个控件上?
如果你是界面是继承自QWidget的话:
void ResetPasswordDialog::showEvent(QShowEv...
Qt
的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘
焦点
,一个
焦点
移出
事件
会被发送给
焦点
窗口(如果有的话)告诉它关于
焦点
失去的事情.然后一个
焦点
进入
事件
被发送给这个窗口部件告诉它刚刚接收到
焦点
.
Qt
的窗口部件在图形用户界面中按用户习惯的方式来处理键盘
焦点
.基本出发点是用户的点击能定向到屏幕上窗口的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘
焦点
能够到达正确的位置,并...