当前位置: 首页 > article >正文

Qt事件循环机制

        受事件循环机制影响,按钮的样式表改变了可能不会立即刷新。

        需要使用 update()repaint()

    或者调用 QApplication::processEvents() 强制处理所有待处理的事件,从而确保界面更新。

        在 Qt 中,事件循环(Event Loop)是应用程序的核心机制,负责处理各种事件(如用户输入、窗口消息、定时器事件等),并将其分发给相应的对象进行处理。事件循环运行在主线程(通常称为 GUI 线程)中,确保应用程序的界面响应用户操作并保持流畅运行。

        以下是 Qt 事件循环的工作原理和相关机制的详细解释:


1. 事件循环的定义

事件循环是一个无限循环,它不断地从事件队列(Event Queue)中取出事件,并将这些事件分发给相应的对象进行处理。事件循环的主要作用是确保应用程序能够及时响应各种事件,从而保持界面的交互性和响应性。


2. 事件的来源

事件可以来自多种来源,包括但不限于:

  • 用户输入:如鼠标点击、键盘输入等。

  • 系统消息:如窗口大小改变、窗口关闭等。

  • 定时器事件:通过 QTimerQElapsedTimer 触发的事件。

  • 网络事件:如网络连接状态变化、数据接收等。

  • 自定义事件:开发者可以通过 QEvent 的派生类创建自定义事件。


3. 事件队列

事件队列是一个先进先出(FIFO)的队列,用于存储待处理的事件。当事件发生时,事件被放入事件队列中,等待事件循环处理。事件队列的管理由 Qt 的事件系统自动完成,开发者通常不需要直接操作事件队列。


4. 事件循环的工作流程

事件循环的工作流程可以概括为以下步骤:

  1. 获取事件

    • 事件循环从事件队列中取出一个事件。

    • 如果事件队列为空,事件循环会进入等待状态,直到有新的事件到来。

  2. 分发事件

    • 事件循环将取出的事件分发给相应的对象(通常是窗口或控件)。

    • 分发过程通过调用对象的 event() 方法完成。

  3. 处理事件

    • 对象接收到事件后,会根据事件类型调用相应的事件处理函数(如 mousePressEventkeyPressEvent 等)。

    • 如果对象没有处理事件,事件会继续向上冒泡,直到被父对象或默认处理程序处理。

  4. 返回事件循环

    • 事件处理完成后,控制权返回到事件循环,事件循环继续处理下一个事件。


5. 事件循环的启动和停止

  • 启动事件循环

    • 在 Qt 应用程序中,事件循环通常在 main() 函数中通过调用 QApplication::exec() 启动。

    • QApplication::exec() 是一个阻塞调用,它会启动事件循环并进入无限循环,直到应用程序退出。

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

    • 事件循环可以通过调用 QApplication::exit()QCoreApplication::quit() 停止。

    • 这些方法会退出事件循环,导致 QApplication::exec() 返回,应用程序随后退出。

  • app.exit();  // 停止事件循环

6. 事件循环的嵌套

        在某些情况下,可能需要在事件循环中启动另一个事件循环。例如,模态对话框(Modal Dialog)通常会启动一个嵌套的事件循环,以确保对话框在关闭之前独占输入焦点。

QDialog dialog;
dialog.exec();  // 启动嵌套事件循环

        嵌套事件循环会暂停当前事件循环,直到嵌套事件循环结束。嵌套事件循环结束后,控制权返回到上层事件循环,继续处理剩余的事件。


7. 事件循环的阻塞

        如果事件处理函数中执行了耗时操作(如复杂的计算、网络请求等),可能会阻塞事件循环,导致应用程序界面无响应。为了避免这种情况,建议将耗时操作放到后台线程中执行,从而避免阻塞主线程的事件循环。

 

QThread* thread = new QThread;
HeavyTask* task = new HeavyTask;
task->moveToThread(thread);
connect(thread, &QThread::started, task, &HeavyTask::run);
connect(task, &HeavyTask::finished, thread, &QThread::quit);
connect(task, &HeavyTask::finished, task, &HeavyTask::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();


8. 事件过滤器

        Qt 提供了事件过滤器(Event Filter)机制,允许开发者在事件分发到目标对象之前拦截和处理事件。事件过滤器可以通过安装 QObject::installEventFilter() 设置。

class EventFilter : public QObject {
protected:bool eventFilter(QObject* obj, QEvent* event) override {if (event->type() == QEvent::KeyPress) {// 处理按键事件return true;  // 表示事件已被处理}return QObject::eventFilter(obj, event);  // 传递给默认处理程序}
};EventFilter* filter = new EventFilter;
someObject->installEventFilter(filter);

        事件过滤器可以用于全局事件处理、拦截特定事件等场景。


9. 自定义事件

        开发者可以通过继承 QEvent 创建自定义事件,并通过 QCoreApplication::postEvent() 将自定义事件发送到事件队列中。

class CustomEvent : public QEvent {
public:static QEvent::Type eventType;  // 静态成员变量CustomEvent() : QEvent(eventType) {}
};QEvent::Type CustomEvent::eventType = static_cast<QEvent::Type>(QEvent::registerEventType());void postCustomEvent(QObject* receiver) {QCoreApplication::postEvent(receiver, new CustomEvent());
}

        自定义事件可以用于实现复杂的事件驱动逻辑。

相关文章:

Qt事件循环机制

受事件循环机制影响&#xff0c;按钮的样式表改变了可能不会立即刷新。 需要使用 update() 或 repaint() 或者调用 QApplication::processEvents() 强制处理所有待处理的事件&#xff0c;从而确保界面更新。 在 Qt 中&#xff0c;事件循环&#xff08;Event Loop&#xff09;是…...

深入理解 OAuth 2.0:技术核心与实战场景

在互联网应用日益复杂的今天&#xff0c;如何安全、高效地实现第三方应用授权访问资源&#xff0c;成为开发者面临的重要问题。OAuth 2.0 凭借其灵活、安全的授权机制&#xff0c;成为解决这一问题的主流方案。本文将深入剖析 OAuth 2.0 的技术重点&#xff0c;并结合具体使用场…...

Rust 环境变量管理秘籍:从菜鸟到老鸟都爱的 dotenv 教程

前言 写代码的你,是否遭遇过这些灵魂拷问: “我现在在哪个环境?开发?测试?还是直接在生产线上裸奔?”“少写一个 .env,测试脚本在数据库里上演清空大法,客户当场破防。”“每次手动设置 RUST_ENV,命令敲到一半就开始怀疑人生,还怕输错一个字符引发灭世级事故。”别慌…...

CSS经典布局之圣杯布局和双飞翼布局

目标&#xff1a; 中间自适应&#xff0c;两边定宽&#xff0c;并且三栏布局在一行展示。 圣杯布局 实现方法&#xff1a; 通过float搭建布局margin使三列布局到一行上relative相对定位调整位置&#xff1b; 给外部容器添加padding&#xff0c;通过相对定位调整左右两列的…...

OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 OpenCV 的 CUDA 模块中&#xff0c;cv::cuda::merge 函数用于将多个单通道的 GpuMat 图像合并成一个多通道的图像。该函数是 cv::merge 的 GP…...

计网实验笔记(一)CS144 Lab

Lab0 ByteStream : 实现一个在内存中的 有序可靠字节流Lab1 StreamReassembler&#xff1a;实现一个流重组器&#xff0c;一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块Lab2 TCPReceiver&#xff1a;实现入站字节流的TCP部分。Lab3 TCPSender&#xff1a;实…...

Blog Contents

目录 Python Financing Medical Logistics Tool(IT & AI) 持续更新~ Python # Name URL 1 Python | Dashboard制作 Python | Dashboard制作-CSDN博客 2 Python | AKShare获取A股数据 Python | AKShare获取A股数据-CSDN博客 3 Python | A股指标对比 Python | A股…...

什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP

什么是ERP&#xff1f; ERP翻译过来叫企业资源计划&#xff0c;通俗的讲&#xff0c;应该叫企业的全面预算控制&#xff0c;其通常包括三个部分&#xff1a;工程预算、投资预算和经营预算&#xff08;即产销存预算&#xff09;。之所以做预算控制&#xff0c;是因为企业运作的…...

dockerfile: PaddleOCR hubserving api 服务

前言 目前 OCR 有比较成熟的方案&#xff0c;想着直接通过 docker 部署一个提供 api 接口服务&#xff0c;查看了一些开源方案&#xff0c;最终发现还是 PaddleOCR 比较好用。 本篇不介绍 PaddleOCR 的详细使用方式&#xff0c;只介绍一下构建镜像的 dockerfile 需要注意的事…...

【速写】TRL:Trainer的细节与思考(PPO/DPO+LoRA可行性)

序言 问题缘起来自发现PPOTrainer里并没有跟SFTTrainer类似的peft_config参数&#xff0c;而SFTTrainer在带和不带peft_config参数的情况下分别对应高效微调和全量微调。自然就会想到是否可以把PPO和PEFT结合&#xff0c;但是目前peft包和trl包上似乎还是存在这种兼容性的问题…...

Vue3+uniapp 封装axios

1.第一步在项目根目录新建utils文件夹&#xff0c;里边新建两个文件request.js和uni-api-promisify.js 2.request.js 代码 要安装axios import axios from axios import { showToast } from /utils/uni-api-promisify// 创建axios实例 const service axios.create({baseURL:…...

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用 如何使用 QEMU 模拟32位 ARM 环境参考&#xff1a;使用Qemu模拟32位ARM系统 修改linux内核源码 使用 linux-4.4.240 源码&#xff0c;下载链接&#xff1a;下载链接 在 arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test&#xff1a; /…...

MySQL——数据类型表的约束

目录 数据类型 数值类型 tinyint类型 bit类型 float类型 decimal类型 字符类型 char类型 varchar类型 日期和时间类型 选择类型 表的约束 null default comment zerofill primary key auto_increment unique key foreign key 数据类型 在MySQL中的数据类…...

# YOLOv2:目标检测的升级之作

YOLOv2&#xff1a;目标检测的升级之作 在目标检测领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天&#xff0c;我们就来深入探讨一下 YOLOv2&#xff0c;看看它是如何在继承 YOLOv1 的基础上进行…...

【爬虫】DrissionPage-1

官网地址&#xff1a;DrissionPage官网 小需求采集&#xff0c;我喜欢&#xff0c;我要学。 1 介绍 这是用python编写的爬虫自动化工具&#xff0c;将Selenium 和 Requests 的功能巧妙地整合在一起&#xff0c;提供了统一又简单的操作接口。开发者可以在浏览器模式&#xff0…...

Oracle OCP认证考试考点详解083系列15

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 71. 第71题&#xff1a; 题目 解析及答案&#xff1a; 关于在 Oracle 18c 及更高版本中基于 Oracle 黄金镜像的安装&#xff0c;以下哪…...

java刷题基础知识

List<int[]> merged new ArrayList<int[]>(); return merged.toArray(new int[merged.size()][]); 表示一个存储 int[] 类型元素的列表&#xff0c;list灵活支持扩展&#xff0c;因为不知道最后有几个区间&#xff0c;所以用list&#xff0c;最后toArray返回成数组…...

部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题

起因是这样: Loaded: loaded (/etc/systemd/system/ollama.service; disabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Tue 2025-05-13 19:31:19 CST; > Process: 12272 ExecStart/usr/bin/ollama serve (codeexited, status1/FAI…...

阿克曼-幻宇机器人系列教程2- 机器人交互实践(Topic)

在上一篇文章中&#xff0c;我们介绍了两种登录机器人的方式&#xff0c;接下来我们介绍登录机器人之后&#xff0c;我们如何通过topic操作命令实现与机器人的交互。 1. 启动 & 获取topic 在一个终端登录树莓派后&#xff0c;执行下列命令运行机器人 roslaunch huanyu_r…...

Spring AI 开发本地deepseek对话快速上手笔记

Spring AI Spring AI是一个旨在推进生成式人工智能应用程序发展的项目&#xff0c;Spring AI的核心目标是提供高度抽象化的组件&#xff0c;作为开发AI应用程序的基础&#xff0c;使得开发者能够以最少的代码改动便捷地交换和优化功能模块‌ 在开发之前先得引入大模型&#xf…...

SpringBoot中的拦截器

SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…...

Spark,IDEA编写Maven项目

以下是在IDEA中使用Maven构建Spark项目的步骤&#xff1a; 一、环境准备 1. 安装JDK - 确保IDEA配置了JDK 8&#xff08;推荐11&#xff09;。 2. 安装Maven - 配置Maven环境变量&#xff0c;IDEA中设置Maven路径&#xff08; File > Settings > Build > Maven &#…...

半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将AI集成到自己的应用中。人工智能正在迅速改变各行各业的工作方式&#xff0c;从自动化客服到智能推荐系统&#xff0c;AI的应用几乎无处不在。Spring AI作为一种开源框架…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备&#xff08;一&#xff09;数据来源与字段说明&#xff08;二&#xff09;数据清洗 四、…...

数学复习笔记 6

前言 复习一下行列式的一些基本的题。感觉网课有点没跟上了。今天花点时间跟上网课的进度。要紧跟进度&#xff0c;然后剩下的时间再去复习前面的内容。多复习&#xff0c;提升自己的解题能力。 行列式和矩阵 三年级&#xff0c;我现在是三年级下册。。。马上就要结束大学的…...

微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现

在上一篇中&#xff0c;我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到&#xff0c;微服务架构的一个核心挑战在于&#xff0c;服务实例的网络位置是动态的&#xff0c;服务之间需要一种机制来互相定位。 想象一下&#xff0c;你开了一家新…...

geoserver发布arcgis瓦片地图服务(最新版本)

第一步&#xff1a;下载geoserver服务&#xff0c;进入bin目录启动 需要提前安装好JDK环境&#xff0c;1.8及以上版本 安装完成&#xff0c;页面访问端口&#xff0c;进入控制台界面,默认用户名密码admin/geoserver 第二步&#xff1a;下载地图 破解版全能电子地图下载器&…...

多边形,矩形,长方体设置

在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体&#xff08;立方体&#xff09; scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…...

Spring Boot 框架概述

1. 简介 Spring Boot 是由 Pivotal 团队开发的一个用于简化 Spring 应用开发的框架。它通过提供默认配置、嵌入式服务器和自动配置等特性&#xff0c;让开发者能够更快速地构建独立的、生产级别的 Spring 应用。 Spring Boot 的主要特点包括&#xff1a; 快速创建独立的 Spri…...

(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c 代码解析&#xff1a; fileio模块&#xff08;文件&#xff08;二进制&#xff09;&#xff09; 写文件&#xff08;保存&#xff09; 函数功能 代码逐行解析 关键知识点 读文…...