添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

首先来说说为什么要设置焦点吧。

设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。

一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、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 的窗口部件在图形用户界面中按用户习惯的方式来处理键盘 焦点 .基本出发点是用户的点击能定向到屏幕上窗口的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘 焦点 能够到达正确的位置,并...