除了信号槽,Qt也使用了另一种手段来响应对象,即事件。比如鼠标左键按下事件,键盘某一个按键按下事件。
Qt的主循环QCoreApplication::exec()就是一个事件循环,这个循环捕获本地计算机产生的各种事件然后将这些事件存放到事件队列中,按照FIFO的顺序将每一个事件传递给相应的对象(QObject)。
事件队列中的事件被传递给QObject::event()函数,这个函数是一个集中分配营,它判断参数是哪种类型的事件,然后将该事件传递给相应的事件处理函数进行处理。而event本身并不对事件进行处理 。

事件的传播顺序:
1. 在QCoreApplication::exec()主循环中,Qt捕获计算机产生的各种事件,如果在此之前还有其他事件没有分配,就暂时将该事件放到事件队列中,随后再按照FIFO顺序一个个传播。
2. 事件经过一系列传播后到达该类的事件过滤器eventFilter(),这个函数对该事件进行过滤,如果返回true则传播终止。返回false则告诉Qt不过滤这个事件,继续传播。
3. 如果没有过滤掉,则随后会传播到该类的event()函数(或其父类),在这个函数中会根据事件的所属类型进行分配,调用相应的事件处理函数。如果不需要再向它的父类传播这个事件,则返回true告诉Qt应该处理完这个事件了。否则,调用父类的event函数来保证由父类来处理这个事件,防止其他类型的事件被忽略掉。
4. 特定的事件处理函数进行处理。

接下来我们逐个讨论这几个函数:

eventFilter

bool QObject::eventFilter(QObject *watched, QEvent *event)

事件过滤函数,会在event函数之前被调用。返回true则告诉Qt事件被过滤掉,反之继续传播给event函数。通常的实现形式为:

/*判断对象指针watched是否是需要过滤掉事件的那个对象*/
/*通常和this比较或者和该类的某个成员变量比较*/
if(watched == this) //或 if(watched == m_watched)
{/*判断事件类型是否是需要过滤的事件*/if(event->type() == /*某个事件类型*/ ){return true;}
}
return false;

event

bool QObject::event(QEvent *e)

如果成功分配掉事件则返回true;否则,调用父类的event函数防止其他类型事件被忽略掉。通常的实现形式为:

if(e->type() == /*event 1*/)
{doThings1();return true;
}
else if(e->type() == /*event 2*/)
{doThings2();return true;
}
//...关心的几个类型的事件分配
return QWidget::event(e); //调用父类的函数

然后就是特定的事件处理函数,举个例子,如果我们需要对鼠标点击事件进行自定义的处理,那么我们就需要在自定义类中重新实现mousePressEvent()函数。又因为这个函数是父类的虚函数,我们无需重新实现event()函数,所以可以像这样:

//.h#include <QWidget>
#include <QLabel>
class MyClass : public QWidget
{Q_OBJECT
public:MyClass(QWidget *parent = 0);
protected:void mousePressEvent(QMouseEvent *event);
private:QLabel *label;
};//.cppMyClass::MyClass(QWidget *parent):QWidget(parent)
{label = new QLabel();setCentralWidget(label);
}void MyClass::mousePressEvent(QMouseEvent *event)
{label->setText(QString("[%1, %2]").arg(event->x(), event->y()));
}

Qt学习笔记-----事件相关推荐

  1. QT学习笔记(七):定时器事件的3种常用使用方式

    QT学习笔记(七):定时器事件的2种常用使用方式 Qt中定时器的使用有2种方法:一种是使用QObject类提供的定时器通过重载 timerEvent 事件处理过程函数,一种就是使用QTimer类. 其 ...

  2. Qt 学习笔记(5)绘图 五子棋游戏

    在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...

  3. QT学习笔记之对话框

    QT学习笔记之对话框 对话框是一种用户界面(窗口),它的主要功能是输出信息和接收用户的输入.在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互. 1)       模式对话框:用户只能与 ...

  4. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  5. 【QT学习笔记】基于QT的天气预报

    [QT学习笔记]基于QT的天气预报 前言 那就开始吧! 先看一下效果 颜面最重要,画个UI 构造实现 怎么开始? 开始解析数据 关于城市切换 ok 最后源码献上 感谢 前言 学习qt已经有一段时间了, ...

  6. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  7. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  8. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  9. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

最新文章

  1. 序列化/反序列化,我忍你很久了,淦!
  2. Android应用开发基础篇(9)-----SharedPreferences
  3. 关于ShopEx的二次开发的目录结构及各文件功能
  4. c语言上机考试设计题及答案,C语言程序设计基础上机考试一题目及参考答案.doc...
  5. 线性规划 (二) 单纯形法
  6. UAV 无人机检测实践分析
  7. 【图像去噪】基于matlab GUI均值+中值+高斯低通+多种小波变换图像去噪【含Matlab源码 856期】
  8. wifi中继的几种方法
  9. C语言dtoc函数,VFP数据库程序设计基础课后作业(二)参考答案(VFP函数表达式练习题--答案)...
  10. 137、TensorFlow使用TextCNN进行文本分类
  11. Mac系统 - 升级node版本
  12. 判断鼠标滑轮滚动事件
  13. 山东省计算机应用能力等级考试,山东省2017年9月全国计算机等级考试报名时间...
  14. 物联卡中心:物联卡是正规卡吗?与流量卡有什么区别?
  15. Java框架tk_TKmybatis的框架介绍和原理解析
  16. word通配符用原文替换原文加某以内容的方式
  17. 【网优谷】如何快速写出有吸引力的网站标题?
  18. 吃一堑长一智!java环境变量配置失败了怎么办
  19. 细分领域创新引领,云和恩墨被正式认定为国家级专精特新“小巨人”企业
  20. SED与AWK学习笔记

热门文章

  1. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测
  2. 程序员面试100题之一:对称字符串的最大长度
  3. caffe学习(1) ubunu 16.04+caffe+cuda8.0+opencv3.1安装
  4. N-Gram的数据结构
  5. mysql中union与union all的区别
  6. Android驱动开发之Hello实例
  7. java RSA加密解密实现(含分段加密)
  8. 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始
  9. 四条命令搞定mysql主从
  10. 简易的设计模式——原型模式