Qt 的 事件队列

Qt 的 事件队列 是其核心事件处理机制之一,用于管理和分发系统与用户生成的事件(如鼠标点击、键盘输入、定时器、信号槽中的队列连接等)。理解 Qt 的事件队列对多线程、界面响应以及异步处理尤为关键。

一、Qt 的事件处理模型概览

Qt 是基于 事件驱动模型 的,每个继承自 QObject 的对象可以通过重载 QObject::event() 或特定事件处理器(如 mousePressEvent())响应事件。

这些事件由 QCoreApplicationQApplication 管理的 事件循环(Event Loop)事件队列 中取出并派发。

二、事件队列的来源

事件队列中的事件通常有以下几种来源:

  1. 系统事件:比如鼠标点击、键盘输入(由操作系统提供)。

  2. Qt内部事件:如定时器事件(QTimer)、绘图事件(QPaintEvent)等。

  3. 自定义事件:可以通过 QEvent 派生类,自定义事件类型。

  4. 跨线程信号槽通信:使用 QueuedConnection 连接类型时,信号通过事件队列传递。

三、事件队列的添加方式

1. 使用 QCoreApplication::postEvent()

用于向某个对象发送一个自定义事件(异步发送,加入事件队列)。

QCoreApplication::postEvent(receiver, new QCustomEvent());
2. 使用 QTimer::singleShot()

 实现延时异步事件,也会通过事件队列调度:

QTimer::singleShot(0, receiver, SLOT(handleLater()));
四、事件循环(Event Loop)

事件循环负责不断从事件队列中取事件,并分发处理。主事件循环由 QApplication::exec() 启动: 

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow w;
    w.show();
    return app.exec(); // 启动主事件循环
}

你也可以在工作线程中创建自己的事件循环:
 QEventLoop loop;
loop.exec(); // 启动局部事件循环

五、跨线程通信和事件队列

当两个 QObject 分属不同线程,并用 QueuedConnection 连接时:

  • 信号被封装成一个事件,放入接收者所属线程的事件队列。

  • 槽函数将在目标线程的事件循环中执行。

  • QObject::connect(sender, &Sender::signal1, receiver, &Receiver::slot1, Qt::QueuedConnection);

只要目标线程有事件循环在运行(例如主线程或调用了 exec() 的线程),信号就会在目标线程执行。 

六、事件队列相关的类 

QEvent所有事件的基类
QCoreApplication负责事件调度和投递
QEventLoop事件循环对象
QThread每个线程都可拥有自己的事件队列
QTimer基于事件队列的定时器
QMetaObject::invokeMethod()支持跨线程调用槽函数,使用事件队列传递

七、事件队列调试技巧 

  • 使用 qDebug() 打印调试信息。

  • 对自定义事件使用 QEvent::type() 区分处理。

  • 使用 QCoreApplication::removePostedEvents() 移除队列中的事件。

  • 如果跨线程信号没有响应,检查接收对象是否有事件循环。

  • 总结一句话

    Qt 的事件队列是一个线程安全的机制,它确保事件(包括跨线程信号)按照顺序、安全地投递给合适的对象,只要该对象所在的线程在运行事件循环。

 

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

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

相关文章

无人机自主导航与路径规划技术要点!

一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位:提供全局定位,但在室内或遮挡环境下易失效。 惯性测量单元(IMU)**:通过加速度计和陀螺仪实时追踪姿态,弥补GPS信号丢失时的定位空缺。 …

Before After:SQL整容级优化

首先说明这个优化有一定提升,但不是我所期望的 我接到一个涉及优化的SQL,具体内容实在太长。而且可能也不利于阅读。于是我脱敏以及简化一下。SQL中间大量的充斥着 (select 列名1 from t1 where t1.id t2.id ) A, (select 列名2 from t1 where t1.id …

道可云人工智能每日资讯|首届世界人工智能电影节在法国尼斯举行

道可云元宇宙每日简报(2025年4月15日)讯,今日元宇宙新鲜事有: 杭州《西湖区打造元宇宙产业高地的扶持意见》发布 杭州西湖区人民政府印发《西湖区打造元宇宙产业高地的扶持意见》。该意见已于4月4日正式施行,有效期至…

JVM 为什么需要即时编译器?

JVM之所以需要即时编译器 (JIT Compiler),是为了提高 Java 程序的执行性能,弥补纯解释器执行的不足。 我们可以从以下几个角度来分析一下这个问题: 1. 解释器的性能瓶颈: 逐条解释的开销: 解释器需要逐条读取 Java 字节码指令,并…

PromptUp 网站介绍:AI助力,轻松创作

1. 网站定位与核心功能 promptup.net 可能是一个面向 创作者、设计师、营销人员及艺术爱好者 的AI辅助创作平台,主打 零门槛、智能化的内容生成与优化。其核心功能可能包括: AI艺术创作:通过输入关键词、选择主题或拖放模板,快速生成风格多样的数字艺术作品(如插画、海报…

ThingsBoard3.9.1 MQTT Topic(1)

1.网关转发子设备的遥测信息, Topic:v1/gateway/telemetry { "m1": [{ "mode": "CW", "temperature": 23 }], "m2": [{ "mode": "CW", "temperature": 23 }] } 说明:json格式&a…

React 入门教程:构建第一个 React 应用

本教程将带你从零开始构建你的第一个 React 应用。我们将创建一个简单的计数器应用,涵盖 React 的基本概念和开发流程。 准备工作 在开始之前,请确保你的开发环境满足以下要求: Node.js (建议使用最新的 LTS 版本) npm 或 yarn (Node.js 安…

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…

策略模式随笔~

若感行文枯燥&#xff0c;请移步至文末Gitee地址中查看源码自行测试感受策略模式之魅力。 一、策略模式的核心概念 策略模式的定义 定义算法族&#xff0c;封装每个算法&#xff0c;使其可互换。 核心三要素 Context&#xff1a;上下文&#xff0c;负责接收客户端请求并委托…

Linux的目录结构(介绍,具体目录结构)

目录 介绍 具体目录结构 简洁的目录解释 详细的目录解释 介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构的最上层是根目录“/”。Linux的世界中&#xff0c;一切皆文件&#xff08;比如&#xff1a;Linux会把硬件映射成文件来管理&#xff09; 具体目…

AWS CloudFront加速S3配置跨域

1、点击分配 源我们就选择S3–>选择我们要加速的S3存储桶 2、创建OAC访问方式 在我们的来源访问处–>来源访问控制设置(推荐)–>选择创建新的OAC(Create new OAC)–>自定义名字按默认选项保存–>选择刚刚新创建的OAC 3、选择查看器的配置 根据具体情况&#x…

进程控制(上)【Linux操作系统】

进程控制 写时拷贝 本质是一种减少深拷贝的方法 Linux中有很多拷贝的场景都用得上写时拷贝&#xff0c;下面以创建子进程时的写时拷贝为例&#xff1a; 子进程被创建的时候&#xff1a; 会继承父进程的mm_struct和页表 所以子进程刚刚继承时&#xff0c;父子进程的代码和数据…

Flutter 强制横屏

在 Flutter 中&#xff0c;可以通过设置 SystemChrome 来强制应用横屏显示。以下是实现这一功能的详细步骤和代码示例&#xff1a; 步骤 1&#xff1a;导入必要的包 确保在文件顶部导入了 services.dart 包&#xff0c;因为 SystemChrome 类位于该包中。 import package:flut…

Git完全指南:从入门到精通版本控制 ------- Git核心命令(6)

Git核心命令完全指南&#xff1a;从入门到高效协作 前言 在软件开发领域&#xff0c;Git已成为现代版本控制的代名词。据统计&#xff0c;全球超过90%的开发团队使用Git进行代码管理。然而&#xff0c;许多开发者仅停留在基础命令的机械使用层面&#xff0c;未能真正掌握Git命…

关于Newtonsoft.Json

历史 Newtonsoft.Json&#xff08;也称为 Json.NET&#xff09;是由 James Newton - King 开发的一个开源的 JSON 处理库&#xff0c;它于 2007 年首次发布。在早期&#xff0c;.NET 平台缺乏一个强大且灵活的 JSON 处理工具&#xff0c;Newtonsoft.Json 应运而生&#xff0c;…

git reset详解

一、git reset 的核心作用 用于 移动当前分支的 HEAD 指针 到指定的提交&#xff0c;并可选择是否修改工作区和暂存区。 ⚠️ 注意&#xff1a;若提交已被推送到远程仓库&#xff0c;强制重置&#xff08;--hard&#xff09;后需谨慎操作&#xff0c;避免影响协作。 二、三种模…

【unity游戏开发入门到精通——UGUI】CanvasScaler画布缩放器组件

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、CanvasScaler画布缩放器组件是什么二、CanvasScaler的三种适配模式1、Cons…

Kubernetes控制平面组件:API Server Webhook 授权机制 详解

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

Python自动化办公

第五篇&#xff1a;Python自动化办公&#xff1a;10行代码搞定重复性工作 适合读者&#xff1a;职场人士、数据分析师 | 阅读时长&#xff1a;12分钟 引言 每天重复处理Excel、PDF或邮件&#xff1f;Python可以帮你自动化这些枯燥任务&#xff0c;节省90%的时间。本文通过实际…

【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库

一、chart资源打包 helm package ./web-chart # 当前目录会生成一个tgz的压缩文件二、安装help push插件&#xff08;用于推送前面打包的文件&#xff0c;到镜像仓库&#xff09; .1 下载help-push二进制文件 wget https://github.com/chartmuseum/helm-push/releases/down…