Qt事件处理

2023-09-20 17:19:24

1. 事件

众所周知Qt是一个基于C++的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过:事件派发 -> 事件过滤->事件分发->事件处理几个阶段。Qt窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作。

事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户按下/移动鼠标、敲下键盘,或者是窗口关闭/大小发生变化/隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标/键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

每一个Qt应用程序都对应一个唯一的 QApplication应用程序对象,然后调用这个对象的exec()函数,这样Qt框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

每一个Qt应用程序都对应一个唯一的 QApplication应用程序对象,然后调用这个对象的exec()函数,这样Qt框架内部的事件检测就开始了(程序将进入事件循环来监听应用程序的事件)。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow* w = new MainWindow;
    w.show();
    return a.exec();
}



1.1 事件在Qt中产生之后的分发过程是这样的:

1.当事件产生之后,Qt使用用应用程序对象调用notify()函数将事件发送到指定的窗口:

[override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);

2.事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤。

// 需要先给窗口安装过滤器, 该事件才会触发
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

3.当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类:

[override virtual protected] bool QWidget::event(QEvent *event);

4.事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件。。。)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函数),比如:鼠标事件:

// 鼠标按下
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
// 鼠标释放
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
// 鼠标移动
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);



2. 事件处理器函数

QWidget为例
在这里插入图片描述


测试案例

在这里插入图片描述

更多推荐

安卓逆向 - EdXposed LSPosed VirtualXposed

一、引言接上篇:安卓逆向-Xposed入门教程_小馒头yy的博客-CSDN博客我们介绍了Xposed入门安装使用,但是只支持到Android8,并且安装模块需要重启。今天我们来看看Xposed的其他版本。二、各种Xposed框架对比1、Xposed只支持到安卓8,安装模块需要重启手机2、EdXposed通过面具安装,安

“微软爱写作”连词摘录

目录前言连词1引入2承接3最后4因果关系5转折关系6并列关系7递进关系8比较关系(相同点)9对照关系(不同点)10举例关系11例外关系12强调关系13条件关系14归纳总结15方位关系16目的关系17重申关系18时间关系19结果关系20依据关系21个人观点22同意观点23不同意观点24兴趣或计划25缺少兴趣前言今天突然发

常用的Spring Boot注解及其作用

SpringBoot是一个用于简化Java应用程序开发的框架,它提供了许多注解来简化开发和配置应用程序。这些注解能够帮助开发者减少重复的劳动,并提高开发效率。下面将详细介绍一些常用的SpringBoot注解及其作用。1.@SpringBootApplication注解是一个复合注解,用于标识一个主启动类。它包含了@Co

FastAPI学习-17.其它响应html,文件,视频或其它

前言通过我们返回JSON类型的接口会比较多,除了返回JSON格式,还可以响应其它格式的内容JSONResponseContent-Type会被设置成application/jsonHTMLResponseContent-Type会被设置成text/htmlPlainTextResponseContent-Type会被设

大数据-玩转数据-Flink CEP编程

一、FlinkCEPFlinkCEP(ComplexeventprocessingforFlink)是在Flink实现的复杂事件处理库。它可以让你在无界流中检测出特定的数据,有机会掌握数据中重要的那部分。是一种基于动态环境中事件流的分析技术,事件在这里通常是有意义的状态变化,通过分析事件间的关系,利用过滤、关联、聚合等

list的介绍及使用

1.list的介绍及使用1.1list的介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似:最主要

c语言进阶部分详解(指针进阶2)

大家好!我快马加鞭接着写出指针部分part2部分。第一部分见:c语言进阶部分详解(指针进阶1)_总之就是非常唔姆的博客-CSDN博客指针初阶部分见:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客一.函数指针1.讲解与实例函数指针:在C语言中,函数指针是指向函数的指针变量。它可以像其他变量一样存储在

命名和代码风格

一段代码,一个方法后面要打换行!!!!api的js代码引入的时候要分开回车空行,例如api的Project.js命名规则:t-dialog控件显示的visible命名的时候例如:visibleVerify,显示审核letself=this的意义,外面的this不是find查询一个对象,search查询多个对象,查多个用

通过Sealos 180秒部署一套K8S集群

通过Sealos180秒部署一套K8S集群一、主机准备1.1主机操作系统说明序号操作系统及版本备注1CentOS7u91.2主机硬件配置说明k8s集群CPU及内存最低分别为2颗CPU、2G内存,硬盘建议为100G+需求CPU内存硬盘角色主机名值8C8G1024GBmasterk8s-master01值8C8G1024G

K8S:Pod容器中的存储方式及PV、PVC

文章目录Pod容器中的存储方式一.emptyDir存储卷1.emptyDir存储卷概念2.emptyDir存储卷示例二.hostPath存储卷1.hostPath存储卷概念2.hostPath存储卷示例三.nfs共享存储卷1.nfs共享存储卷示例四.PV和PVC1.PV、PVC概念2.PVC的使用逻辑及数据流向3.st

《Kubernetes部署篇:Ubuntu20.04基于containerd二进制部署K8S 1.25.14集群(多主多从)》

一、架构图如下图所示:二、部署说明2.1、部署流程1、系统环境初始化,主要包括主机名设置、主机hosts解析、关闭防火墙、关闭swap分区、修改系统参数、时间时区同步、修改内核参数、启用ipvs模式。2、使用一键生成K8S集群证书工具创建证书文件。3、二进制安装etcd集群。4、二进制安装Nginx+keepalive

热文推荐