一、简述

事件主要分为两种:

  • 在与用户交互时发生。比如按下鼠标(mousePressEvent),敲击键盘(keyPressEvent)等。
  • 系统自动发生,比如计时器事件(timerEvent)等。

在发生事件时(比如说上面说的按下鼠标),就会产生一个 QEvent 对象(这里是QMouseEvent,为 QEvent 的子类),这个 QEvent 对象会按照下图所示的流程进行传递:

源码部分如下:

二、事件过滤器

本质上是其他对象插入到当前对象中的间谍,该间谍专门捕获传入到当前对象的 QEvent 对象,发现该 QEvent 符合该间谍的任务要求,则进行处理,申请直接截获该 QEvent 对象,不给当前对象使用。

主对话框拦截向 TextEdit 输入的字符。

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTextEdit>class Widget : public QWidget
{
public:Widget();protected:virtual bool eventFilter(QObject *obj, QEvent *event) override;private:QTextEdit *textEdit;
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QKeyEvent>
#include <iostream>Widget::Widget()
{textEdit = new QTextEdit(this);textEdit->setGeometry(30, 30, 300, 30);textEdit->installEventFilter(this);move(30, 30);
}bool Widget::eventFilter(QObject *obj, QEvent *event)
{if (obj == textEdit){if (event->type() == QEvent::KeyPress){QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);std::cout << "iostream you press " << keyEvent->key() << std::endl;//事件不再进行传播,拦截return true;}elsereturn false; //继续传播}else{//当不确定是否继续传播时,按照父类的方法来处理//即调用父类的evenFilter函数return QWidget::eventFilter(obj, event);}
}

三、事件分发器

函数原型:

virtual bool event(QEvent *e)

返回 true,表明该事件本函数已经处理完了,不用劳烦老爹处理了。

返回 false,表明该事件关我 PI 事,还是交给老爹处理吧。

如果想要老爹处理需要沟通一下,语言如下:

return QWidget::event(e);

老爹的操作就是将该事件根据类型的不同分配到不同是事件分发器中。

四、事件处理

不同的事件对象有不同的处理函数,例如鼠标抬起事件,其专用处理函数为:

virtual void mousePressEvent(QEvent *);

五、小结

(SAW:Game Over!)

Qt / Qt5 事件(event)机制详解相关推荐

  1. Qt中事件循环机制详解

    问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...

  2. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  3. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

  4. View的事件体系之三 android事件分发机制详解(下)

    接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...

  5. 安卓自定义View进阶-事件分发机制详解

    原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理  ...

  6. spring事件通知机制详解

    优势 解耦 对同一种事件有多种处理方式 不干扰主线(main line) 起源 要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类: ApplicationEventPub ...

  7. Android View 事件分发机制详解

    想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...

  8. python制作界面怎么触发事件_python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from que ...

  9. epoll边缘触发_epoll事件通知机制详解,水平触发和边沿触发的区别

    看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题.不去更深入的了解,只能停留在知其然而不知其所以然.于是,把epoll手册翻译一遍,更深入理解和掌握epoll事件处理相关知识 ...

  10. python事件触发机制_python模拟事件触发机制详解

    本文实例为大家分享了python模拟事件触发机制的具体代码,供大家参考,具体内容如下 EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from que ...

最新文章

  1. 如何用 Nginx 在公网上搭建加密数据通道
  2. iPhone开发中的一些小技巧
  3. 对比SQL,学习Pandas操作:group_concat如何实现?
  4. linux卸载时提示未安装,Ubuntu 安装卸载软件命令,及出现没有可用软件包提示时的处理办法...
  5. ❤️开发项目必备技能《Git用法集合》建议收藏❤️
  6. FISCO BCOS Failed to connect to nodes: [ ssl hanshake failed:/192.168.64.131:20200]
  7. java linklist6_Java基础知识点总结--从细节再看Java(六)--List及LinkedList
  8. ·ZZULIOJ 1040~1049(oj入门题)
  9. 分布式操作系统与网络操作系统异同点
  10. 智能制造,从smart到intelligent
  11. 波浪谱 matlab画,matlab窄带随机过程
  12. 使用Android Studio和阿里云数据库实现一个远程聊天程序
  13. linux卸载带输入法,Ubuntu删除自带的输入法之后设置不见了
  14. 前端开发应收藏的各大网站
  15. 开启ICT宝藏之门——CloudOpera IES 创新社区正式成立
  16. 小米音频测试软件,小米10 Pro成DXOMARK手机音频新榜首 雷军略显骄傲
  17. 微信小程序如何页面分享,如何图片长按识别二维码等问题汇总
  18. AGC自动增益控制概述
  19. 在知识蒸馏中不要忘记教师网络detach()
  20. 爬虫--08:移动端数据的抓取

热门文章

  1. 4.Nginx配置进阶(四)
  2. 67、Fragment实现Tab
  3. 流媒体开发之开源项目live555---live555 server 编译 包括更改帧率大小
  4. 错误:”未能加载文件或程序集“System.Web.Mvc, Version=2.0.0.0” 解决方法
  5. 【3分钟掌握】什么是DNS解析
  6. 完整版使用Shell脚本在多个服务器同时实现Mysql建表语句和删除表
  7. vscode插件:REST Client发送http请求
  8. spark on k8s配置日志存储路径:spark-defaults.conf
  9. k3s containerd查看镜像命令示例
  10. Jenkins真正地完整迁移流程(亲测有效)