当前位置:网站首页>Qt | 事件系统 QEvent
Qt | 事件系统 QEvent
2022-08-02 14:41:00 【华为云】
前言:
在 Qt 中,事件是被作为一个对象的,继承自 QEvent 类。事件和信号不是一个概念,比如说单击一下界面上的按钮,这时产生一个鼠标事件(QMouseEvent),这个事件不是按钮产生的,但是因为按钮被按下,所以按钮会发射一个单击信号(clicked()),这个信号是按钮产生的。
事件的流程是: 发生一个事件时,就会产生一个 QEvent 对象,这个 QEvent 对象会传递给当前部件的 event()函数。如果当前部件没有安装事件过滤器 eventFilter,则会被 event 函数放到相应的事件函数(xxxEvent)中去。
事件主要分为两类:
在与用户交互时发生(比如按下鼠标:mousePressEvent);
系统自动发生(比如定时器事件:timerEvent);
QObject 子类实例都可以接收和处理事件。
事件的处理:
当我们接收到一个事件,需要对事件进行处理时,一般会有下面这几种方法:
方法一:重新实现事件函数。 例如重新实现部件的 paintEvent()、mousePressEvent()等事件处理函数。这时最常用的一种方法,不过只能用来处理特定部件的特定事件。
例如: void paintEvent(QPaintEvent *event);
方法二:重新实现 notify()函数。 这个函数的功能非常强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。但是它一次只能处理一个事件。
方法三:向 QApplication 对象上安装事件过滤器。 因为一个程序只有一个 QApplication 对象,所以这样实现的功能与使用 notify()函数是相同的,优点是可以同时处理多个事件。
方法四:重新实现 event()函数。 QObject 类的 event()函数可以在事件到达默认的事件处理函数之前获得该事件。
例如: bool event(QEvent *event);
方法五:在对象上安装事件过滤器。 使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
例如: bool eventFilter(QObject *obj, QEvent *event);
最常用的方法是方法一、其次是方法五。因为方法二需要继承自 QApplication 类,方法三要使用一个全局的事件过滤器,这会减缓事件的传递,所以这两个方法虽然很强大,但是很少用。
事件的传递:
一个多层级的窗口中,事件是先传递给指定窗口部件的,也就是先传递给获得焦点的窗口部件。但是如果该部件的事件函数中调用了 ignore()函数忽略掉这个事件,那么这个事件会传递给这个部件的父部件。
重新实现事件处理函数时,一定要调用父类的相应事件处理函数来实现默认操作。例如:
在 paintEvent()函数末尾要调用:QWidget::paintEvent(event);
在 event()函数末尾要调用:return QWidget::event(event);
在 eventFilter()函数末尾调用:return QWidget::eventFilter(obj, event);
事件的传递顺序是: 先是事件过滤器,然后是焦点部件的 event()函数,最后是焦点部件的事件处理函数;如果焦点部件忽略了该事件,那么会执行父部件的事件处理函数。
边栏推荐
猜你喜欢
2022-7-15 第五组 瞒春 学习笔记
使用 docker 搭建 redis-cluster 集群
第三章-函数的增长-3.1-渐近记号
该死的单元测试,写起来到底有多痛?
如何查看微信小程序服务器域名并且修改
“绿色低碳+数字孪生“双轮驱动,解码油气管道站升级难点 | 图扑软件
什么是hashCode?
浅析PM2实用入门指南
【 Leetcode string, the string transform/hexadecimal conversion 】 HJ1. The length of the string last word HJ2. Calculation of a certain number of characters appear HJ30. String merging processing
nacos
随机推荐
已解决ModuleNotFoundError: No module named‘ pip‘(重新安装pip的两种方式)
2022 VMware下载安装教程
NXP i.MX 8M Mini工业核心板B2B版本,4核ARM [email protected]设计
2022-07-19 第五小组 瞒春 学习笔记
setTimeout与setInterval的区别
2022-07-21 第六小组 瞒春 学习笔记
PAT甲级 1143 最低公共祖先
codeforces Linova and Kingdom
为什么四个字节的float表示的范围比八个字节的long要广?
使用 docker 搭建 redis-cluster 集群
MySQL查询
开篇-开启全新的.NET现代应用开发体验
容器中的Cgroup
23.支持向量机的使用
A status code, and access baidu process
为什么四个字节的float表示的范围比八个字节的long要广
Getting Started with MySQL Syntax
Wigner-Ville distribution for time-frequency analysis
Application software code signing certificate
2022-07-11 第五小组 瞒春 学习笔记