[QT编程系列-5]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:事件(用于与系统的交互)、信号(对象与对象之间的通信)

目录

2. QT程序的运行框架

2.5 事件的捕获与处理

2.5.1 QT 事件与信号的区别

2.5.2 QT程序架构

2.5.3 QT的事件机制


2. QT程序的运行框架

2.5 事件的捕获与处理

2.5.1 QT 事件与信号的区别

在Qt中,事件(Event)和信号(Signal)是两种不同的机制,用于处理和传递不同类型的信息或动作

它们在使用方式触发方式处理方式上有所区别:

  1. 触发方式:

    • 事件是由操作系统或用户操作直接触发的,例如鼠标点击、键盘输入、窗口大小调整等。Qt的事件系统会捕获并分发这些事件,然后通过事件过滤器、事件处理器或重写虚函数的方式进行处理。
    • 信号是由Qt对象自身主动发出的,它表示一种对象状态的变化或特定的动作发生。对象发出信号后,其他对象可以连接到该信号,通过槽函数来处理信号,并执行相应的操作。
  2. 处理方式:

    • 事件的处理通常通过重写特定的虚函数或者安装事件过滤器来实现。事件处理函数会在事件循环中被调用,以响应事件的发生。事件处理器可以处理多种类型的事件,具体的事件类型在函数的参数或者事件对象中提供。
    • 信号的处理是通过连接信号和槽函数来实现的。对象发出信号后,所有连接到该信号的槽函数都会被触发,并执行相应的操作。
  3. 应用场景和目的:

    • 事件通常用于与用户交互和响应用户操作,例如处理鼠标、键盘、窗口等外部事件。它们提供了一种直接的方式来处理和响应这些动作,以及对应的状态变化。
    • 信号通常用于对象间的通信和协调,通过信号和槽的连接,不同的对象可以实现松耦合的通信方式。信号和槽机制可以用于实现模块间的消息传递、状态变化通知等。

总结来说,事件和信号在Qt中有不同的用途和处理方式。

事件用于响应外部的、直接触发的操作,而信号用于对象间的通信和协调。

事件通过事件处理器或者事件过滤器来处理,而信号通过连接和槽函数来处理。

它们在应用中常常相互配合使用,以实现全面的功能和反应。

2.5.2 QT程序架构

2.5.3 QT的事件机制

在Qt中,事件(Event)是指由用户操作或系统触发的特定动作或状态更改,例如按下鼠标按钮、键盘输入、窗口大小调整等。

Qt的事件系统提供了一种机制来捕获、处理和响应这些事件。

Qt的事件系统基于一种特殊的C++机制——事件过滤器(Event Filters)和事件处理器(Event Handlers)。以下是Qt中事件的一般处理流程:

  1. 重写事件处理器函数:在Qt中,对于事件所属的类,你可以通过重写特定的虚函数来处理相应的事件。这些虚函数经过预定义,以便与各种事件相关联。例如:

    • QWidget类中的keyPressEvent(QKeyEvent *event)方法可以处理键盘按键事件。
    • QAbstractButton类中的mousePressEvent(QMouseEvent *event)方法可以处理鼠标按钮按下事件。
    • QResizeEvent类中的resizeEvent(QResizeEvent *event)方法可以处理窗口大小调整事件。

    通过重写这些事件处理函数,你可以实现对事件的自定义处理逻辑。

  2. 安装事件过滤器:除了重写事件处理函数外,你还可以通过安装事件过滤器来处理事件。事件过滤器是一个辅助对象,用于拦截并处理其他对象的事件。你可以通过重写QObject类的eventFilter(QObject *watched, QEvent *event)方法来实现事件过滤器。

    要安装事件过滤器,使用QObject::installEventFilter()方法将其安装到需要监视和处理事件的对象上。然后,通过在事件过滤器中实现eventFilter()方法,你可以在过滤器中检测和处理特定类型的事件。

除了以上两种方式,你还可以使用Qt的信号和槽机制来处理事件

某些事件发出与对象之间的信号,你可以连接这些信号到相应的槽函数来实现事件的处理逻辑。

需要注意的是,Qt中的事件处理是通过事件循环(Event Loop)机制来实现的。事件循环监听并处理来自操作系统的事件,并将其分发到适当的处理函数来进行处理。

补充说明:以上内容是根据常见的情况而言,不同的Qt类可能会有不同的事件处理方式。当你使用特定的Qt类时,请参考对应的文档以了解事件处理的具体细节。

 

 

 

 

 

 

 

 在Qt中,事件处理链描述了事件从发生到被处理的过程,涉及多个对象之间的事件传递和处理

Qt的事件处理链包括以下几个关键角色:

  1. 发送事件的对象(Sender):事件的来源对象,如窗口、控件等。它会生成一个事件并发送给Qt的事件系统。

  2. 事件目标对象(Event Target):事件的目标对象,即事件最终要传递到的对象。通常是发送事件的对象所属的对象。

  3. 事件过滤器对象(Event Filter):事件过滤器是一种辅助对象,它可以插入到事件的传递链中,拦截并处理其他对象的事件。通过重写QObjecteventFilter()方法并安装事件过滤器,可以拦截和处理目标对象及其子对象的事件。

  4. 事件的传递和处理流程:

    • 发送事件:发送者对象生成一个特定类型的事件,并通过QObject::event()方法将事件发送给Qt的事件系统。

    • 事件分发:Qt事件系统接收到事件后,会首先将事件分发给目标对象。目标对象是相关的QWidget或QObject,它会依次调用事件处理器函数或特定的重写虚函数来处理事件。

    • 事件过滤:在事件分发的过程中,目标对象会检查是否安装了事件过滤器。如果安装了事件过滤器,则目标对象会将事件传递给事件过滤器进行处理。事件过滤器可以选择拦截、修改或传递事件,然后返回一个布尔值,指示是否继续将事件传递给目标对象。

    • 事件冒泡:如果事件没有被事件过滤器阻止,或者没有安装事件过滤器,事件会进入目标对象的默认事件处理流程。如果目标对象是窗口的子对象,且事件类型支持冒泡(例如键盘事件),则该事件会传递给上一级父对象,并继续进行事件分发和处理。

    • 事件传递链:事件传递和处理会不断上升到父对象,直到事件被处理、拦截或到达了顶级窗口。事件可以在传递链上的对象之间进行传递,如果某个对象处理了事件,则其父对象将不会接收到该事件。

    • 事件处理完结:事件处理链中的最终目标对象或事件过滤器可以选择是否处理该事件,如果事件没有被处理,则会继续传递,并最终返回给操作系统对事件进行处理。

通过事件处理链,Qt提供了一种灵活而强大的机制来处理和传递事件,以响应用户操作和系统触发的事件。你可以通过重写虚函数、安装事件过滤器以及连接信号和槽来自定义事件的处理逻辑,使应用程序能够具有更高的交互性和可扩展性。

 在Qt中,可以通过将事件转换成信号的方式来处理和传递事件。

这种方式可以使事件处理更加方便和灵活,利用了Qt的信号和槽机制。

以下是将事件转换成信号的一般步骤:

  1. 创建一个需要处理事件的对象,可以是QWidget、QObject等。

  2. 在该对象中,定义一个槽函数来处理事件。

    public slots:void handleEvent(...); // 定义事件处理的槽函数
    
  3. 相同的对象中,通过重写事件虚函数event()安装事件过滤器eventFilter来捕获事件。

    • 重写虚函数的方式:

      bool YourObject::event(QEvent* event) {// 检查事件类型,并根据需要执行相关操作if (event->type() == QEvent::EventType) {// 处理事件,如果需要发送信号,则调用槽函数emit yourSignal(...); // 发送信号return true; // 停止事件的传递}return QObject::event(event); // 继续事件传递
      }
      
    • 定义事件过滤器

      bool YourObject::eventFilter(QObject* watched, QEvent* event) {if (watched == someObject && event->type() == QEvent::EventType) {// 处理事件,如果需要发送信号,则调用槽函数emit yourSignal(...); // 发送信号return true; // 停止事件的传递}return QObject::eventFilter(watched, event); // 继续事件传递
      }
      
    • 安装事件过滤器的方式:然后在需要安装事件过滤器的地方,使用installEventFilter()方法来安装事件过滤器。

  4. 在同一个对象中,定义一个信号,该信号与槽函数相对应。

    signals:void yourSignal(...); // 定义一个信号
    
  5. 在需要的地方,连接信号和槽函数。

    connect(yourObject, &YourObject::yourSignal, receiverObject, &ReceiverObject::handleEvent);
    

这样,当事件在对象中触发时,通过上述步骤,可以将事件转换成信号,并通过连接的方式将信号传递给特定的槽函数进行处理。

通过将事件转换成信号的方式,可以在应用程序中灵活地处理和传递事件,同时利用了Qt的信号和槽机制,实现模块之间的通信、状态变化通知等。

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

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

相关文章

记录第一次组装电脑遇到的坑

京东装机大师配置清单如下: 主板cpu安装 本次安装拆了两次主板 原因1.主板侧面有个金属板需要从内部安装 2.cpu风扇有个板需要装在主板底下 显卡比较大个要最后装,要不然可能要拆好几次 装系统时候 u盘启动认不出来,他妈的是因为机箱上的usb…

低代码开发平台助力解决企业开发效率问题

编者按:随着企业应用需求的不断增加,提高企业开发效率已经成为许多企业的目标。传统的开发方法显然不适用,开发平台通过可视化拖拉拽搭建等易用性和高扩展性可以帮助企业解决这个问题。 关键词:可视化开发、私有化部署、前后端分离…

Blazor前后端框架Known-V1.2.3

V1.2.3 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazor…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!🌟🌟🌟 …

刷题记录02

题目1 解析: 遍历字符串,使用cur去记录连续的数字串, 如果遇到不是数字字符,则表示一个连续的数字串结束了, 则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到ret。 具体代码: import jav…

LNMP环境搭建

文章目录 LNMP环境搭建LNMP部署之Nginx编译安装nginx LNMP部署之MySQLRPM安装 LNMP部署之PHPyum安装php连接数据库测试 LNMP环境搭建 LNMP是一种web服务器架构,与LAMP类似。它由Linux、Nginx、MySQL和PHP组成,这四个组合再一起提供了一个完整的Web服务器…

【数据结构】AVL树

文章目录 AVL树1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转 AVL树 1. AVL树的概念 二叉搜索树可以缩短查找的效率,但是如果数据接近有序二叉搜索树将会退化为单支,查找元素相当于在顺序表中搜索元素,效率低下。 当向二…

【面试题28】什么是PHP-FPM?它与PHP和Nginx有什么关系

文章目录 一、前言二、什么是PHP-FPM?三、PHP-FPM的生命周期3.1 启动阶段3.2 初始化阶段3.3 请求处理阶段3.4 关闭阶段 四、PHP-FPM与PHP的关系五、PHP-FPM与Nginx的通信方式六、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖P…

华为战略方法论:BLM模型之战略意图(限制版)

目录 前言 案例 BLM模型 专栏列表 CSDN学院 个人简介 前言 对于任何一家企业来说,即便你没有清晰的战略规划。 一般也都是会有战略意图的。 战略意图具体是指你主观想要达成什么样的期望或者是状态。 换句话说,如果没有这种期望,你…

【云存储】主流分布式文件系统介绍

目录 1、引言 2、云存储与分布式文件系统 2.1、云存储 2.2、分布式文件系统 3、Google的三大云计算与云存储论文 3.1、The Google File System(谷歌文件系统) 3.2、MapReduce:Simplified Data Processing on Large Clusters&#xff0…

分类模型评估指标详解(二分类、多分类、混淆矩阵)

一 、二分类评估 1.混淆矩阵 (ConfusionMatrix) TP:1的预测为1 (正确的积极) 正确判断 FP:0预测为1 (错误的积极) 错误判断 FN:1预测为0 (正确的消极) 漏判断的 TN:0预测为0 (错误的消极) 成功未判断的 准确率:(a…

个人云服务器搭建MQTT服务器

个人云服务器搭建MQTT服务器 文章目录 个人云服务器搭建MQTT服务器1️⃣ 前言2️⃣ EMQX部署 1️⃣ 前言 MQTT 👉MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输协议 • 是一个轻量的发布订阅模式消息传输协议,专门…