在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。当应用有多个窗口时就要使用焦点事件了!
Qt中有很好的焦点事件管理,我在这里抛砖引玉了。一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)
void
|
setFocusPolicy
( Qt::FocusPolicy
policy
)
|
就是设置焦点事件模式的函数,其中函数的参数为
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::ClickFocus,其他不赘述。
当前有焦点事件的窗口只能有一个,当一个窗口获取焦点事件或失去焦点事件时,可能需要相应的操作,或者如何判断一个才窗口有没有焦点事件。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
()
这两个函数就是设置或清除焦点事件的。
要想知道更多,只需要在“Qt助手”的“索引”中输入“Focus”,自己动手吧!!
在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。当应用有多个窗口时就要使用焦点事件了!Qt中有很好的焦点事件管理,我在这里抛砖引玉了。一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)voidsetFocusPolicy ( Qt::FocusPolicy policy )
Qt
输入法
事件
(QInputMethodEvent)演示小程序。
程序功能:在失去
QT
extEdit控件失去
焦点
的时候放弃正在输入的内容。
解决搜狗(或QQ)输入法等输入法失去
焦点
时会将字幕输入到输入框问题。
运用了
Qt
的
事件
监听(eventFilter)技术,自定义窗口部件(提升法)技术。
~~~注释详细。
鼠标穿透:
默认情况下, 多层嵌套窗口各层全都会接收到鼠标
事件
(只要重写了鼠标
事件
函数), 而当加入以下函数调用后, 当前窗口将会透过鼠标点击
事件
(即该窗口对鼠标
事件
不在响应, 即使重写了鼠标
事件
函数)。注意参数第二项设为false时将恢复默认。
setAttribute(
Qt
::WA_TransparentForMouseEvents, true);
键盘
焦点
代理:
QT
的QApplication>提供了很多全局的信号,在程序的任何位置都可以接收处理,如:
void
focus
Changed(QWidget *old, QWidget *now)
void applicationStateChanged(
Qt
::ApplicationState state)
void commitDataRequest(QSessionManager &manager)
Qt
事件
模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的
事件
。
让我们试着设想已经有了一个CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 现在,我们想用空格键来代替Tab,使
焦点
在这些QLineEdit间切换。
一个解决的方法是子类化QLineEdit,重新实现keyPressEvent(),并在keyPressEvent()里调用
focus
NextChild()。像下面这样:
void MyLineEdit::keyPressEvent(QKeyEvent *event)
if (event->key() ==
Qt
::Key_Space) {
focus
NextChild();
} 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) {
focus
NextChild();
return true;
return QDialog::eventFilter(target, event);
在上面的函数
中
,我们首先检查目标部件是否是 firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit。接着,我们判断
事件
是否是按键
事件
。如果
事件
是按键
事件
,我们把
事件
转换为QKeyEvent。接着,我们判断是否按下了空格键,如果是,我们调用
focus
NextChild(),把
焦点
传递给下一个控件。然后,返回,true通知
Qt
,我们已经处理了该
事件
。
如果返回false的话,
Qt
继续将该
事件
发送给目标控件,结果是一个空格被插入到QLineEdit
中
。
如果目标控件不是 QLineEdit,或者按键不是空格键,我们将把
事件
传递给基类的eventFilter()函数。
Qt
提供5个级别
今天调试登录框的时候,发现登录框出现的时候,发现
focus
不在密码输入框
中
。就四处查
焦点
问题,以及tab键的
焦点
调转顺序。
首先要感谢这篇文章:【
QT
】新弹窗默认无
焦点
给了我一个思路,我能不能在窗口show出来之后,或者show
事件
中
知道当前的
focus
在哪个控件上?
如果你是界面是继承自QWidget的话:
void ResetPasswordDialog::showEvent(QShowEv...
Qt
使用信号和槽机制来完成对象之间的协同操作,信号与槽都是函数,比如单击窗口上的一个按钮后想要弹出一个对话框,就可以将这个按钮的单机信号和自定义的槽关联起来,在这个槽
中
创建一个对话框并显示它。
槽的声明:槽一般使用slots关键字进行修饰, public slots: void showChildDialog();
槽的定义:
Qt
Creator设计了一个快速添加定义的方法:单击showChildDialog()槽,同时摁下Alt+Enter键(也可以在
清除
focus
其实包含2个部分的操作:
清除当前View的
focus
标志,并且清除它的祖先节点
中
存储的m
Focus
信息
调用DecorView的request
Focus
()方法,重新寻找一个View,并将其设置为
focus
request
Focus
()都是以先序遍历的方式,找到第一个
focus
InTouchMode的View,并将其设置为
焦点
所以,之所以有时候发现EditText...
Qt
事件
是一种在
Qt
应用程序
中
发生的
事件
,例如鼠标点击、键盘按键或窗口大小更改等。以下是
Qt
中
常见的
事件
类型:
1. QMouseEvent:鼠标
事件
,例如单击、双击和移动。
2. QKeyEvent:键盘
事件
,例如按键、释放和重复。
3. Q
Focus
Event:
焦点
事件
,例如获得或失去
焦点
。
4. QResizeEvent:大小更改
事件
,例如窗口大小的更改。
5. QPaintEvent:绘制
事件
,例如绘制窗口或控件。
6.
QT
imerEvent:定时器
事件
,例如定期执行代码。
7. QCl
os
eEvent:关闭
事件
,例如关闭窗口或应用程序。
8. QDragEnterEvent:拖动进入
事件
,例如拖动文件到应用程序
中
。
9. QDropEvent:拖放
事件
,例如将文件拖放到应用程序
中
。
10. QWheelEvent:滚轮
事件
,例如鼠标滚轮的滚动。
解决undefined reference to `pthread_atfork'/`pthread_detach'/`pthread_create'/`pthread_join'
guiluo3171:
最少硬币找零问题-动态规划
Obliviate°:
排序算法之插入排序
gggg达:
约瑟夫环问题
于楷力——一个成绩优异的男同学……: