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

news2024/11/27 14:41:59

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

近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
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.coloradmin.cn/o/474868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪些问题是ChatGPT不会回答我的?

哪些问题是ChatGPT不会回答我的&#xff1f; 文章目录 哪些问题是ChatGPT不会回答我的&#xff1f;前言ChatGPT擅长回答哪些问题呢&#xff1f;结语 前言 对于chatgpt&#xff0c;人们或许会觉得无论什么问题&#xff0c;它都能够答复&#xff0c;但对于以下这些问题&#xff…

云和恩墨荣获2023数字中国创新大赛·信创赛道“最具发展潜力奖”等4个奖项

4月27日&#xff0c;作为2023数字中国创新大赛信创赛道系列活动之一的“信创与开源技术论坛”在福州召开&#xff0c;信创赛道全国总决赛颁奖仪式在该论坛上举行。云和恩墨的参赛作品“安稳易用的企业级国产数据库 - MogDB”经过层层筛选、角逐&#xff0c;最终荣获“信创赛道最…

2023五一数学建模竞赛选题人数公布

数据来源自&#xff0c;各个平台人数投票统计&#xff0c;仅供参考。 具体数值比例为&#xff1a; 题号人数A504B1174C1905 目前&#xff0c;五一数模竞赛C题半成品论文基本完成制作&#xff08;累计35页&#xff0c;10000字&#xff09;&#xff0c;注&#xff1a;蓝色字体…

面向画布(Canvas)的JavaScript库

面向画布(Canvas)的JavaScript库 总结 每个库各有特色&#xff0c;根据需求选择 学习要点 面向画布(Canvas)的JavaScript库 EaselJS 是一个封装了 HTML5 画布(Canvas) 元素的 JavaScript 库。jCanvaScript面向HTML5画布&#xff08;canvas&#xff09;的Javascript类库&…

【C++】switch 语句

1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言&#xff0c;今天学习到了 switch 语句。为了加强记忆&#xff0c;所以就写了一篇关于 switch 语句的博客。 switch 语句是 C 中的一种流程控制语句&#xff0c;它可以根据变量的值来执行不同的代码块。这种语句通常用于替代…

《LearnUE——基础指南:上篇—0》——UE架构

UE架构 给我一个UObject&#xff0c;我可以翘起整个UE 思考&#xff1a;如果让我们自己来设计一款3D渲染引擎&#xff0c;你会怎么设计整个架构&#xff1f; 目前&#xff0c;市面上有众多的3D游戏引擎和各种三维渲染引擎&#xff0c;像常见的渲染库OpenGL&#xff0c;WebGL&…

垃圾邮件、欺骗和网络钓鱼,如何防止电子邮件安全意识的威胁

网络安全意识月已过半&#xff0c;本周我们的重点是电子邮件安全意识。 在我们最近为此活动撰写的一篇博客中&#xff0c;我们介绍了电子邮件系统面临的一些最严重的危险——包括垃圾邮件、欺骗和网络钓鱼——以及用户如何主动在他们的电子邮件中发现这些攻击并采取措施避免它…

【Python】如此轻松就能PDF和word互转?【详细教程来啦】

文章目录 前言一、pdf2docx功能二、限制三、安装四、案例总结 前言 可将 PDF 转换成 docx 文件的 Python 库。该项目通过 PyMuPDF 库提取 PDF 文件中的数据&#xff0c;然后采用 python-docx 库解析内容的布局、段落、图片、表格等&#xff0c;最后自动生成 docx 文件。 一、…

A-star算法自学

搜索过程 广度优先搜索&#xff08;BFS&#xff09;算法与Dijsktra算法的结合&#xff0c;可以得出最短的路径。 将地图信息通过划分为方形或者其他多边形格子的方法进行表示&#xff0c;便于利用二维数组存放地图信息&#xff0c;每个格子有可行和不可行两种状态&#xff1b;…

[Python图像处理] 小波变换执行图像融合

小波变换执行图像融合 图像融合基础使用小波变换执行图像融合图像融合相关链接 图像融合基础 图像融合是将多个输入图像组合到单个输出图像中的过程&#xff0c;输出图像中包含比单个输入图像更好的场景描述。一个好的图像融合方法应当具备以下属性&#xff1a; 它可以保留不…

JavaScript实现用while语句计算1+n的和的代码

以下为输入圆的半径,输出周长、体积和面积实现结果的代码和运行截图 目录 前言 一、实现用while语句计算1n的和 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 【附加】用while计算110的和 1.1代码段 1.3 运行截图 前言 1.若有选择&#xff0c;您…

如何为ChatGPT应用程序自定义模型-微调(fine-tuning)

介绍 通过微调&#xff0c;您可以通过提供以下内容从通过 API 提供的模型中获得更多收益&#xff1a; 比提示设计更高质量的结果能够训练比提示所能容纳的更多示例由于提示时间较短&#xff0c;可以节省代币更低的延迟请求 GPT-3 已经对来自开放互联网的大量文本进行了预训练…

Opencv C++图像处理(全)

文章目录 Opencv官方资料BUG集合一、入门基础1.1、头文件说明&#xff1a;#include <opencv2/opencv.hpp>1.2、头文件说明&#xff1a;#include <opencv2/highgui/highgui.hpp>1.3、计算消费时间函数1.3.1、耗时&#xff1a;getTickCount()1.3.2、频率&#xff1a;…

项目管理-团队管理的4个激励理论

冲突和竞争 冲突&#xff1a;是指两个或两个以上的社会单元在目标上互不相容或互相排斥&#xff0c;从而产生心理上的或行为上的矛盾。冲突并不一定是有害的&#xff0c; “一团和气”的集体不一定是一个高效率的集体。对于有害的冲突要设法加以解决或减少&#xff1b;对有益的…

大三生变身AI顾问入职Prada 抢饭碗的AI造出新饭碗

“ChatGPT让我有点焦虑&#xff0c;我长大了还能找到工作吗&#xff1f;”这是一名小学生透过视频表达的担忧&#xff0c;她有点懊恼&#xff0c;“GPT简直无所不能&#xff0c;会画画、编程、写论文、创作音乐......而我们还在学加减乘除。”这段视频让网友直呼&#xff0c;AI…

并发编程基石:管程

大家好&#xff0c;我是易安&#xff01; 如果有人问我学习并发并发编程&#xff0c;最核心的技术点是什么&#xff0c;我一定会告诉他&#xff0c;管程技术。Java语言在1.5之前&#xff0c;提供的唯一的并发原语就是管程&#xff0c;而且1.5之后提供的SDK并发包&#xff0c;也…

Java新提案,最终还是靠近C#了

Java是一门非常优秀的编程语言&#xff0c;特别是生态繁荣&#xff0c;成熟的轮子很多&#xff0c;各种解决方案都有&#xff0c;要开发一个项目&#xff0c;只需把轮子组装&#xff0c;并根据自己的项目&#xff0c;进行自定义修改&#xff0c;可以极大地提升开发效率。 曾经…

构建OVS网络

构建OVS网络 1. 配置虚拟机环境 &#xff08;1&#xff09;配置虚拟机交换机 1 创建一个名为br-xd的虚拟交换机。 # ovs-vsctl add-br br-xd 2 查询虚拟交换机。 # ovs-vsctl show 5a1cd870-fc31-4820-a7f4-b75c19450582 Bridge br-xd Port br-xd …

QT C++入门学习(1) QT Creator安装和使用

Qt官方下载 Qt 官网有一个专门的资源下载网站&#xff0c;所有的开发环境和相关工具都可以从这里下载&#xff0c;具体地址是&#xff1a;http://download.qt.io/ 进入链接后&#xff0c;是一个文件目录&#xff0c;依次进入这个路径&#xff1a;archive/qt/5.12/5.12.9/qt-o…

NXP公司LPC21XX+W25Q128实现外扩Flash

W25Q128FV串行Flash存储器由65536页组成&#xff0c;每一页256字节&#xff0c;总共128Mbit&#xff0c;相当于16M字节的存储空间。一次写入可操作高达256字节&#xff0c;擦除可以按16个页擦除&#xff08;即一个Sector&#xff09;&#xff0c;128个页擦除&#xff08;八个Se…