Qt5.9学习笔记-事件(一)

news/2024/4/19 11:40:41/文章来源:https://blog.csdn.net/qq_37457202/article/details/130378882

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。
如果觉得本文能帮到您,麻烦点个赞👍呗!

近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏定期更新Qt的一些项目Demo
项目与比赛专栏定期更新比赛的一些心得面试项目常被问到的知识点。

QT5.9专栏会定期更新有趣的Qt知识

以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
在这里插入图片描述

最近在重新梳理一下Qt事件的基础知识,发现了一些有趣的知识点和开发的坑点,做一些笔记。

当涉及到Qt5.9事件时,事件系统是非常重要的一个主题。Qt5.9事件系统是一个强大的工具,它允许开发人员在Qt应用程序中响应和处理各种类型的事件。在本文中,我们将讨论Qt5.9事件系统的基础知识以及如何在应用程序中使用它来处理事件。

目录

    • 长文大纲:
    • 1. 事件系统基础介绍
      • 1.1 事件和事件处理的定义
      • 1.2 事件的种类和分类
      • 1.3 事件循环
    • 2. Qt5.9中的事件处理
      • 2.1 事件过滤器
      • 2.2 事件处理函数
      • 2.3 事件分发和派发

长文大纲:

  1. 事件系统基础介绍
  • 事件和事件处理的定义
  • 事件的种类和分类
  • 事件循环
  1. Qt5.9中的事件处理
  • 事件过滤器
  • 事件处理函数
  • 事件分发和派发
  1. 自定义事件
  • 创建自定义事件
  • 发送和处理自定义事件
  • 使用自定义事件来扩展Qt应用程序
  1. 多线程和事件
  • 理解多线程和事件处理
  • 跨线程事件的发送和处理
  1. Qt5.9中的常见事件
  • 定时器事件
  • 鼠标事件
  • 键盘事件
  • 窗口事件
  1. 事件调试和排查
  • 调试事件处理
  • 查找事件相关问题的技巧

1. 事件系统基础介绍

1.1 事件和事件处理的定义

在Qt5.9中,事件是指在应用程序中发生的事情。这些事件可以来自操作系统或其他应用程序组件,如鼠标或键盘输入、定时器事件等。事件处理是指在Qt5.9应用程序中对这些事件进行响应和处理的机制。

1.2 事件的种类和分类

在Qt5.9中,事件可以分为以下几类:

  • QEvent: 基本事件类,所有其他事件类都派生自QEvent。
  • QInputEvent: 鼠标、键盘等输入事件类。
  • QWheelEvent: 鼠标滚轮事件类。
  • QFocusEvent: 焦点事件类。
  • QTimerEvent: 定时器事件类。
  • QResizeEvent: 窗口大小调整事件类。
  • QCloseEvent: 关闭事件类。
  • QPaintEvent: 绘制事件类。

1.3 事件循环

事件循环是Qt5.9中的核心机制之一,用于处理事件并响应应用程序的输入。在Qt5.9中,事件循环会不断地从系统事件队列中获取事件并将其派发到应用程序中的事件接收者(即QObject派生类对象)中。

Qt的事件循环是一个核心机制,用于在应用程序中处理各种类型的事件。事件循环不断地从系统事件队列中获取事件并将其派发到应用程序中的事件接收者(即QObject派生类对象)中,以便响应应用程序的输入。

事件循环在Qt中非常重要,因为它允许应用程序以一种非阻塞的方式响应用户输入。事件循环的运行方式通常是在应用程序启动时自动启动,并在应用程序关闭时自动停止。

以下是一个简单的例子,演示了如何在Qt中使用事件循环:

cppCopy code#include <QApplication>
#include <QLabel>int main(int argc, char *argv[])
{QApplication app(argc, argv);QLabel label("Hello, world!");label.show();return app.exec(); // 启动事件循环
}

在这个例子中,我们创建了一个应用程序并在应用程序中创建了一个QLabel对象。我们将该对象显示在屏幕上,然后通过调用QApplication::exec()函数来启动事件循环。

当应用程序启动时,事件循环将开始运行。在事件循环运行期间,任何用户输入(如鼠标或键盘事件)都会被放入系统事件队列中,然后被事件循环处理。在这个例子中,我们使用了一个非常简单的应用程序,但在更复杂的应用程序中,事件循环通常是应用程序中最重要的部分之一。

需要注意的是,Qt的事件循环通常是由QApplication对象来管理的,因此在使用Qt时,通常需要创建一个QApplication对象并通过它来启动事件循环。

希望这个例子能够帮助你更好地理解Qt的事件循环。

2. Qt5.9中的事件处理

2.1 事件过滤器

事件过滤器是一种机制,它允许在事件到达目标对象之前对其进行拦截和处理。在Qt5.9中,可以通过QObject::installEventFilter()函数来为一个对象安装事件过滤器。事件过滤器需要实现QObject::eventFilter()函数,该函数将在事件到达目标对象之前被调用。

Qt5.9的事件过滤器是一种机制,用于在Qt应用程序中拦截和处理事件。它可以让我们在事件传递到目标对象之前截获事件并执行一些自定义操作,例如修改事件、记录事件、阻止事件等。

事件过滤器可以应用于任何QObject派生类对象,并通过重载QObject::eventFilter()函数来实现自定义的事件处理逻辑。事件过滤器通常被用来增强Qt应用程序的交互性、改善用户体验以及实现一些高级的功能。

以下是一个简单的例子,演示了如何在Qt中使用事件过滤器:

#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QEvent>
#include <QDebug>class MyEventFilter : public QObject
{
public:bool eventFilter(QObject* obj, QEvent* event) override{if (event->type() == QEvent::MouseButtonPress){qDebug() << "Mouse button pressed!";return true; // 拦截事件}return QObject::eventFilter(obj, event);}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);QPushButton button("Click me");MyEventFilter filter;button.installEventFilter(&filter); // 安装事件过滤器QLabel label("Hello, world!");label.show();return app.exec();
}

在这个例子中,我们创建了一个QPushButton对象,并为其安装了一个事件过滤器MyEventFilter。在事件过滤器的eventFilter()函数中,我们检查事件的类型是否为QEvent::MouseButtonPress(鼠标按钮按下),如果是,则打印一条消息并返回true,表示拦截了事件。否则,我们调用了父类的eventFilter()函数,继续将事件传递到目标对象中。

通过安装事件过滤器,我们可以拦截和处理按钮的所有事件,包括鼠标事件和键盘事件等。在这个例子中,我们只处理了鼠标按钮按下的事件,并打印了一条消息。如果我们想要拦截并处理其他类型的事件,只需要在eventFilter()函数中进行相应的处理即可。

总的来说,事件过滤器在Qt应用程序中有很多应用场景,例如捕获和处理快捷键、记录用户操作、实现拖放等。它可以让我们更加灵活地控制和定制Qt应用程序的事件处理逻辑。

2.2 事件处理函数

事件处理函数是指为一个对象实现的用于处理特定事件的函数。在Qt5.9中,可以为QObject派生类对象实现特定事件的处理函数,例如:

cppCopy codevoid MyWidget::mousePressEvent(QMouseEvent* event)
{// 处理鼠标按下事件
}

2.3 事件分发和派发

简单来说,就是当操作系统接收到事件并将其传递给Qt应用程序时,Qt框架会将该事件封装成QEvent对象,并将其插入到事件队列中。事件分发机制会不断从事件队列中取出事件,并将其分发到正确的QObject派生类对象中进行处理。

#include <QApplication>
#include <QWidget>
#include <QKeyEvent>class MyWidget : public QWidget
{
public:MyWidget(QWidget *parent = nullptr) : QWidget(parent){setWindowTitle("My Widget");setFixedSize(300, 200);}protected:void keyPressEvent(QKeyEvent *event) override{if (event->key() == Qt::Key_Escape)qApp->quit();}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);MyWidget w;w.show();return app.exec();
}

在上面的代码中,我们定义了一个MyWidget类,它继承自QWidget。在MyWidget类中,我们重载了keyPressEvent()函数,该函数用于处理键盘事件。如果用户按下了Esc键,则我们调用qApp->quit()函数来退出应用程序。

在main()函数中,我们创建了一个QApplication对象,并创建了一个MyWidget对象并显示出来。当用户在MyWidget对象中按下键盘时,该事件将被传递给操作系统,并由操作系统将其发送到Qt应用程序的事件队列中。事件分发机制会不断从事件队列中取出事件,并将其分发到正确的QObject派生类对象中进行处理。在本例中,当键盘事件被分发到MyWidget对象时,MyWidget对象的keyPressEvent()函数会被调用,从而完成了事件的处理。

小结:事件分发和派发是指在Qt5.9中将事件发送到目标对象并处理它的过程。事件分发是指事件循环从系统事件队列中获取事件并将其分发到目标对象。事件派发是指目标对象的事件处理函数被调用来处理特定的事件。

最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103765.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对git的简单总结

Git的基本使用 配置用户名和邮箱常见的操作查看仓库的状态远端仓库整体流程分支本地分支命令远端分支命令 这几天在做毕业设计&#xff0c;需要用到git&#xff0c;所以简单总结一下git的基本使用。 配置用户名和邮箱 git config --global user.name "Your Name" g…

ai模型训练生成效果 chilloutmix_NiPrunedFp32Fix.safetensors

模型名称&#xff1a; chilloutmix_NiPrunedFp32Fix.safetensors 关键词 extremely detailed CG unity 8k wallpaper,(masterpiece),(best quality),(ultra detailed),(ultra realistic),(Best character details:1.2),dynamic angle,professional lighting, photon mapping, …

【22-23 春学期】人工智能基础--AI作业6-误差反向传播

老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 目录 老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 1.梯度下降 2.反向传播 3.计算图 4.使用Numpy…

【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;用一个类来代理另一个类或几个类的功能。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 延迟初始化&#xff08;虚拟代理&#xff09;。如…

FPGA基础知识 LCMXO3LF-6900C-6BG400I FPGA可编程逻辑简介

FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c;既解决了定…

喜报 | ScanA内容安全云监测获评“新一代信息技术创新产品”

4月20日&#xff0c;在赛迪主办的2023 IT市场年会上&#xff0c;“年度IT市场权威榜单”正式发布。 知道创宇的ScanA内容安全云监测产品荣获“新一代信息技术创新产品”奖项。作为中国IT业界延续时间最长的年度盛会之一&#xff0c;历届IT市场年会公布的IT市场权威榜单已成为市…

状态模式——随遇而安

● 状态模式介绍 状态模式中的行为是由状态来决定的&#xff0c;不用的状态下有不同的行为。状态模式和策略模式结构几乎完全一样&#xff0c;但它们的目的、本质却完全不一样就。状态模式的行为是平行的、不可替代的&#xff0c;策略模式的行为是彼此孤立、可相互替换的。用一…

微分方程数值解法(Runge-Kutta法PLC实现)

微分方程数值解法之欧拉法请参看下面的博客文章: 微分方程数值解法(PID仿真用一阶被控对象库PLC算法实现)_数学微积分算法plc编程实例_RXXW_Dor的博客-CSDN博客微分方程除极特殊情况外,大部分不可能求出它的精确解,只能用各种近似方法得到满足一定精度的近似解,微分方程由…

web端导航菜单系列

导航菜单属于导航中最常规的一种导航模式&#xff0c;它有2个显而易见的用途&#xff1a;帮助我们找到想要的任何东西和告诉我们现在身在何处。帮助用户在不同页面之间跳转找到目标功能。 导航作为网站或者平台的骨架&#xff0c;是产品设计中不容忽视的一环。结合自身对于导航…

如何建立Linux与git的连接?

文章目录 建立连接三板斧&#xff1a; 本文以Xshell为案例进行与git的连接&#xff01; 建立连接三板斧&#xff1a; add , commit ,push Linux与git远程连接的方法&#xff1a; 1.设置全局的用户名和邮箱 git config – global user.name “你的用户名” git config – glo…

Springboot Mybatis使用pageHelper实现分页查询

以下介绍实战中数据库框架使用的是mybatis&#xff0c;对整合mybatis此处不做介绍。 使用pageHelper实现分页查询其实非常简单&#xff0c;共两步&#xff1a; 一、导入依赖&#xff1b; 二、添加配置&#xff1b; 那么开始&#xff0c; 第一步&#xff1a; pom.xml添加依…

不得不的创建型模式-原型模式

原型模式是一种创建型模式&#xff0c;它通过复制一个已有对象来创建新的对象&#xff0c;而无需知道新对象的具体类型。 原型模型的结构&#xff1a; 下面是一个简单的C实现原型模式的代码示例&#xff1a; #include <iostream> #include <string> #include <…

ChatGLM ptuning 的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

LVS+keepalived 群集

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色的服务器&#xff…

tongweb

13051667606 东方通产品介绍 产品兼容 硬件要求 安装 安装目录结构 启动tongweb 停止tongweb bin下常用命令 企业版管理控制台 文档&#xff1a;产品简介及安装指南 绿色版直接解压安装 tar -zxvf …tar.gz Tongweb的配置文件 在conf的tongweb.xml 修改端口等信息 通过页面…

宁波博视眼科俞存院长:晒太阳会晒出白内障?是真的吗?

春意渐浓&#xff0c;人们纷纷踏出家门&#xff0c;享受暖暖的阳光。众所周知&#xff0c;适当晒太阳可以促进人体合成维生素D&#xff0c;对身体有一定的好处。 但你知道吗?太阳光中的紫外线可能会导致部分眼病的出现&#xff0c;例如&#xff1a;白内障。 晒太阳怎么会晒出白…

028:Mapbox GL 绘制线段,实时测量长度距离值

第028个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制线段,编辑线段,实时显示长度值。这里使用turf来计算长度值,采用默认的单位千米。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代…

使用WireShark抓包分析TCP_IP协议

文章目录 前言一、TCP/IP协议1.1 OSI分层1.2 TCP/IP 分层 二、抓包2.1 Socket代码2.2 过滤包 三、分析3.1 TCP首部3.2 实战分析3.3 三次握手3.4 四次挥手 参考 前言 TCP/IP 协议 是一组用于互联网通信的协议。它由两个主要协议组成&#xff1a;传输控制协议&#xff08;TCP&am…

RabbitMq-接收消息+redis消费者重复接收

在接触RammitMQ时&#xff0c;好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…

排查和解决CentOS系统上Nacos服务启动报错“java.net.UnknownHostException: jmenv.tbsite.net“问题

背景 环境是CentOS7操作系统&#xff0c;nacos服务宕掉了&#xff0c;启动服务的时候报错。 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.FilterRegistrationBean]: Factory method ‘di…