Qt——事件
1.常见事件
【1】鼠标事件
(1)坐标
x(),y(),
相对windows globalX() globalY()
(2)获得点击
button()
【2】键盘事件
【3】定时器事件
timerID1 = startTimer(time)
timerID2 = startTimer(time)
killTimer(timerID1)
timeEvent()
{
if (e->timerId() == timerID1) {
}
}
2. 事件的接受和忽略
示例:
同时设置 mousePressEvent() 和 connect(,clicked,)
当事件发生后,
mousePressEvent() 执行,而 connect 没触发
原因:
事件触发后传递给 mousePressEvent, mousePressEvent接受了事件,所以事件没有继续向下传,就没有发出 clicked 信号。
如果希望触发 connect,需要在 mousePressEvent中调用父类的mousePressEvent。
结论:
信号和事件的关系
信号有两种来源:事件生成信号、手动生成信号(emit signal())
如果自定义控件后,重写事件虚函数,那么会导致信号无法生成,需要再调用基类事件函数以生成信号。
事件的接受和忽略
accept() ignore()
谁的事件产生,谁先得到事件,传递方向是向父控件(不是基类)
事件选择 accpet() ,事件不会传向父控件
事件选择 ignore() , 事件会传递给父控件
默认情况:
实验:
myFrame -> QFrame
mousePressEvent
子控件 myFrame 父控件继承于 QWidget
结果:
默认情况,没有传递
accept, 没有传递
ignore 传递给父控件
再次总结事件和信号
事件由 exec() 监听,谁的事件触发,执行谁的事件处理函数
信号由 emit 以广播形式发出, connect 会监听信号
借助事件处理函数执行 emit signal, 实现事件触发信号
3. 事件的过滤
(1)事件的处理流程
不考虑事件过滤器:QApplication::exec()循环监听事件,当事件触发,Qt构造事件对象(所有事件对象都继承与 QEvent),事件对象传递给触发事件的 QObject::event() 函数, event() 不直接处理事件,而是进行事件的转发,事件将由对应的 event handler 处理。
event()
bool QObject::event(QEvent *e);
返回值:
true 表示,Qt会认为事件已经被正确处理,不会再将事件传递给父控件对象,而是处理事件队列中的其他事件。
false,事件未被处理,将传递给其他对象。
event()中使用 accpet() 和 ignore 是没有的。
event()是 protect ,意味可以重写该虚函数,实现事件的过滤,
如下,就只关注键入 tab 的事件
bool CustomTextEdit::event(QEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
if (keyEvent->key() == Qt::Key_Tab)
{
qDebug() << "You press tab.";
return true;
}
}
return false;
}
event的其他用处
如下为 Qt5 的 event() 源码, 可以看出,可以只重写 event() ,就可以完成所有 event handler 的处理。
//!!! Qt5
bool QObject::event(QEvent *e)
{
switch (e->type()) {
case QEvent::Timer:
timerEvent((QTimerEvent*)e);
break;
case QEvent::ChildAdded:
case QEvent::ChildPolished:
case QEvent::ChildRemoved:
childEvent((QChildEvent*)e);
break;
// ...
default:
if (e->type() >= QEvent::User) {
customEvent(e);
break;
}
return false;
}
return true;
}
总结:
event() :
作用:事件的分发
返回值:true ,事件成功分发,不会再传递,false,事件会被传递; accept ignore 无用
用法:
事件过滤,只向下分发需要的事件,其他的则传递给别的对象(即返回 false)
event handler的集中处理。
事件过滤器
安装过滤器后,事件的处理流程:
exec()监听事件,事件触发,Qt构造事件对象,经过事件过滤器,通过过滤再到 event(),event()分发给event handler。
事件过滤器的好处,可以集中处理控件的事件过滤,避免写多个 event()
virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
返回值: true 事件被过滤,事件不会传递给目标对象(watched),false事件会传递给目标对象(watched)
调用时机:事件传递给目标对象前
使用方法:
设置一个(生命周期)全局的事件过滤器,一般用 主控件,重写 eventFileter。
需要过滤的对象安装 过滤器
过滤器安装:
void QObject::installEventFilter ( QObject * filterObj )
过滤器移除
QObject::removeEventFilter()
过滤器的执行顺序:如果一个对象安装了多个过滤器,那么后安装先执行。
其他:
过滤器和被过滤对象必须同个线程,否则无用。
过滤器会降低执行速度,慎用
class MainWindow : public QMainWindow
{
public:
MainWindow();
protected:
bool eventFilter(QObject *obj, QEvent *event);
private:
QTextEdit *textEdit;
};
MainWindow::MainWindow()
{
textEdit = new QTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
} else {
return false;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}
Qt——事件的更多相关文章
- QT事件
qtevents多线程工作object存储 Another Look at Events(再谈Events) 最近在学习Qt事件处理的时候发现一篇很不错的文章,是2004年季刊的一篇文章,网上有这篇文 ...
- Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)
Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...
- qt事件传递过程和处理
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- Qt 事件机制
[1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...
- 【转】QT事件传递与事件过滤器
[概览] 1.重载特定事件函数. 比如: mousePressEvent(),keyPressEvent(), paintEvent() . 2.重新实现QObject::ev ...
- 详解 QT 源码之 Qt 事件机制原理
QT 源码之 Qt 事件机制原理是本文要介绍的内容,在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使 Qt 程序进入消息循环.下面我们就到ex ...
- Qt事件机制---信号通过事件实现,事件可以过滤,事件更底层,事件是基础,信号是扩展。
转:http://www.cnblogs.com/findumars/p/8001484.html Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和.先处理自己队列中的消息,然后再处 ...
- Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)
Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.. Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. Qt事件的类型很多, 常见的qt的事件如下: 键盘事 ...
- [GUI] QT事件与X11的关系
做了一段时间linux下与QT事件相关的工作,经常会遇到X11,总是苦于无法完全理解其与linux以及QT事件之间的关系,所以用两篇文章来简单总结下linux中的图形管理和QT事件与X11的关系. & ...
- qt事件机制(转)
学习了一段时间的Qt之后,发现Qt的事件机制和其他语言的机制有些不同.Qt除了能够通过信号和槽机制来实现一些Action动作之外,还可以用对象所带的事件,或者用户自定义的事件来实现对象的一些行为处理. ...
随机推荐
- 使用CoreImage教程
使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...
- dbms_randon package
reference to wbsite:http://zhangzhongjie.iteye.com/blog/1948930#comments DBMS_RANDON PACKAGE: Define ...
- 贴现力 (force of discount)
一.定义 用贴现函数a-1(t) 代替累积函数,在 t 时刻的贴现力为 增加一个负号使得贴现力为正. 二.重要的公式
- CentOS 6 网络yum源配置
# CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update ...
- February 3 2017 Week 5 Friday
Laughter is an instant vacation. 笑一笑,身心轻松宛如度了个短假. Always present a smile on your face, even there's ...
- Posix多线程编程学习笔记
Blaise Barney, Lawrence Livermore National Laboratory )标准制订了这一标准接口.依赖于该标准的实现就称为POSIX threads 或者Pthre ...
- Msql数据库连接写一个共有的连接工具
为了避免在每一个DAO中都需要自行连接connection,有多个DAO里都需要获取数据库的连接,并且在很多项目中都是一样的数据库连接. 所以就可以把获取数据库连接的代码重构到一个类里. 这样做的好处 ...
- Race UVA - 12034(dp+打表)
Disky and Sooma, two of the biggest mega minds of Bangladesh went to a far country. They ate, coded ...
- WINDOWS 负载均衡NLB配置中单播与多播区别(转载)
单播 在单播模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修 ...
- java.sql.date和java.util.date的区别和转换
不同点:java.util.Date是在除了SQL语句的情况下面使用的.java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分java.util.Date 是 java.sql. ...