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

Qt程序退出相关资源释放问题

目录

问题背景:

aboutToQuit

代码举例

资源释放函数注意事项

closeEvent事件

代码举例

程序退出方式

quit()

 exit(int returnCode = 0)

 close()


问题背景:

         实际项目中程序退出前往往需要及进行一些资源释放、配置保存、线程中断等操作,避免资源浪费,配置参数丢失等;但是Qt程序默认的退出方式并不能释放主动申请的这些资源,因此在程序关退出前需要主动进行资源回收和记录退出方式等。

aboutToQuit

        aboutToQuit信号是QCoreApplication类的一个信号,它在应用程序即将退出时发出。这个信号对于在应用程序关闭前执行一些清理工作非常有用,比如保存设置、释放资源等。 使用场景:通常连接到一个槽函数,用于处理应用程序退出前的清理工作。

代码举例

通过连接 aboutToQuit信号到资源释放槽函数,从而达到在程序退出前进行资源释放操作。

int main(int argc, char *argv[])
{QApplication a(argc, argv);THWritterTool w;w.show();QObject::connect(qApp, &QCoreApplication::aboutToQuit, [&]() {cLogger("THWritterTool")->info("THWritterTool程序正常退出!");w.Destroy();ReleaseResource();});int ret = a.exec();//在事件循环结束后进行一些资源释放 一些非正常退出无aboutToQuit信号releaseResource();return ret;
}

资源释放函数注意事项

        在上面的额代码中releaseResource函数调用了两次是为了防止一些异常退出没有触发aboutToQuit信号,从而导致资源无法释放。但是正常情况下该函数会调用两次,因此releaseResource函数种要确保资源只被释放一次。此处一种解决方案可以用std::call_once和std::once_flag解决此问题。

	void ReleaseResource(){std::call_once(m_releaseFlag, [](){//...g_pSplashScreen->releaseInstance();cLogger("unInit")->info("vehicleApi::httpServer.stopServer");vehicleApi::httpServer.stopServer();g_CacheHelper->saveCfg();g_CacheHelper->free();cLogger("unInit")->info("PlatformPluginManager::free");//...//...cLogger("unInit")->info("All finished");});}

closeEvent事件


        closeEvent是QWidget类的一个事件处理函数,当窗口关闭时,Qt会调用这个函数。通过重写主界面的这个函数可在窗口关闭前执行一些自定义的操作,比如询问用户是否真的要关闭窗口,或者保存未保存的数据。 

代码举例

void THWritterTool::closeEvent(QCloseEvent * event)
{if (!m_AuthorithyVertify){QTHMessageBox::TimerMessage(this, QMessageBox::Critical, QObject::tr("授权未验证通过,程序即将退出!"), 15 * 1000);cLogger("THWritterTool")->info("授权未验证通过退出");}else if (m_switchDB){QTHMessageBox::TimerMessage(this, QTHMessageBox::Critical, QObject::tr("数据库已切换,程序即将退出!"), 15 * 1000);cLogger("THWritterTool")->info("切换数据库程序退出");}else{if (m_savingCfg){QTHMessageBox::TimerMessage(this, QTHMessageBox::Warning, QObject::tr("正在保存配置文件,无法退出。"), 15 * 1000);event->ignore();//忽略退出事件return;}ret = QTHMessageBox::question(this, tr("是否要退出程序?"), QTHMessageBox::Yes | QTHMessageBox::No);if (ret == QTHMessageBox::Yes){cLogger("THWritterTool")->info("用户手动确认退出");}}cLogger("THWritterTool")->info("正常退出");Destroy();event->accept();//接收事件 不在传递
}

程序退出方式

quit()

      • quit()是QCoreApplication类(以及继承自它的QApplication类)的一个静态函数,用于退出整个Qt应用程序。

      • 当调用quit()时,它会退出主事件循环,触发QApplication::exec()返回,并关闭所有打开的窗口。程序会完全终止。

      • quit()通常用于在应用程序中实现“退出”功能,比如在菜单项的“退出”操作上绑定这个函数。

      • quit()作为槽函数,也可以连接信号和槽,响应某个信号后关闭应用程序。
      
      • 调用quit后程序在退出前会触发aboutToQuit信号

 exit(int returnCode = 0)

      • exit()和quit()类似,也是用于退出应用程序。

      • exit()可以指定一个返回代码(returnCode),该代码将在应用程序退出时返回给操作系统。

      • 它同样会结束主事件循环并关闭所有窗口。

      • exit()更适合在需要返回特定退出代码的场景中使用。
      
      • 调用exit后程序在退出前会触发aboutToQuit信号

 close()

      • close()是QWidget类的成员函数,用于关闭单个窗口或控件。

      • 调用close()会尝试关闭该窗口或控件,关闭前会触发closeEvent()事件。如果该窗口是主窗口,且所有子窗口都已关闭,应用程序会退出,退出前会触发和aboutToQuit信号。

      • close()适用于关闭单个窗口或控件的场景,比如“关闭”按钮的操作。

      • 当用户点击窗口右上角的“X”按钮时,系统也会自动调用该窗口的close()函数。
      

相关文章:

Qt程序退出相关资源释放问题

目录 问题背景: aboutToQuit 代码举例 资源释放函数注意事项 closeEvent事件 代码举例 程序退出方式 quit() exit(int returnCode 0) close() 问题背景: 实际项目中程序退出前往往需要及进行一些资源释放、配置保存、线程中断等操作&#xff0c…...

Ubuntu 22.04安装K8S集群

以下是Ubuntu 22.04安装Kubernetes集群的步骤概要 一、设置主机名与hosts解析 # Master节点执行 sudo hostnamectl set-hostname "k8smaster" # Worker节点执行 sudo hostnamectl set-hostname "k8sworker1"# 所有节点的/etc/hosts中添加: ca…...

Kubernetes的Ingress 资源是什么?

在Kubernetes中,Ingress资源是一种用于管理集群外部对内部服务访问的API对象,主要用于将不同的外部请求路由到集群内的不同服务,以下是关于它的详细介绍: 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…...

Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程

在现代的API接口调试中,效率和精确性对于开发者和测试人员来说至关重要。Apifox,作为一款功能强大的API管理和调试工具,近年来不断提升其用户体验和智能化功能。最近,Apifox 推出了增强版的AI接口调试功能,其中包括自动…...

MATLAB基础学习相关知识

MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...

DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑

DeepSeek作为一款前沿的人工智能大模型,凭借其强大的多模态理解、知识推理和内容生成能力,正在重构文旅产业的发展逻辑,推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构:打造全域感知的智…...

蓝桥与力扣刷题(蓝桥 交换瓶子)

题目:有 N 个瓶子,编号 1 ~ N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况&#x…...

腿足机器人之十一- 深度强化学习

腿足机器人之十一- 深度强化学习 机器人能力腿足机器人RL问题建模强化学习解决方案 强化学习算法库选择建议 深度学习技术已经在语音、图像、视频、文本等领域应用广泛,其和强化学习的结合使得基于深度学习的大模型能力更是上升一个台阶。因而用在腿足机器人的运动中…...

纠错检索增广生成论文

一、摘要 动机:RAG严重依赖于检索文档的相关性,如果检索出错,那么LLM的输出结果也会出现问题 解决方案:提出纠正性检索增强生成(CRAG)即设计一个轻量级的检索评估器,用来评估针对某个查询检索…...

多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题

多源 BFS 是一种解决 边权为 1 的多源最短路问题 的高效算法。其核心思想是将所有源点视为一个“超级源点”,通过一次 BFS 遍历即可计算所有节点到最近源点的最短距离。以下从原理、实现和代码示例三个方面深入讲解: 目录 一、原理分析 1. 单源 BFS vs…...

Jenkins 构建 Unity 打包 .apk 同时生成 .aab

Jenkins 构建 Unity 打包 .apk 同时生成 .aab Android App Bundle简称 AAB,想了解更多关于 AAB 的知识,请看官网 https://developer.android.google.cn/guide/app-bundle/faq?hlzh-cn APK 打包部分在复用上一篇 Jenkins 构建 Unity打包APK 一、新建一…...

LTO优化详解

嵌入式开发过程中的LTO优化是什么意思?能够用来解决什么问题?它都优化了哪些?仅开启LTO真的可以优化SIZE的问题吗? 请分别回答我刚才提到的问题? 嗯,用户问关于嵌入式开发中的LTO优化,我需要详细解释这个概…...

嵌入式之条件编译

在C编程中,条件编译是一种在编译时根据特定条件选择性地包含或排除代码的技术。它通过预处理器指令来实现,允许程序员根据不同的编译环境、平台或配置来控制哪些代码被编译。条件编译在跨平台开发、调试、功能开关场景中非常有用。 1. 预处理器指令 条…...

清华大学第五弹:《DeepSeek与AI幻觉》

作者:清华大学新闻与传播学院新媒体研究中心、人工智能学院(新媒沈阳团队) 时间:2025年2月 完整版下载地址:夸克网盘分享 一、AI幻觉的定义与分类 定义 学术定义:模型生成与事实不符、逻辑断裂或脱离上下…...

理解构件的3种分类方法

对于Java程序员来说,理解“构件分类方法”是非常重要的,因为这直接关系到如何高效地管理和复用软件组件。以下是针对三种常见分类方法的具体解释: 构件的3种分类方法 1. 关键字分类法 (Keyword Classification Method) 关键字分类法是最直…...

分布式数据库解析

title: 分布式数据库解析 date: 2025/2/20 updated: 2025/2/20 author: cmdragon excerpt: 通过金融交易、社交平台、物联网等9大真实场景,结合Google Spanner跨洲事务、DynamoDB毫秒级扩展等38个生产级案例,揭示分布式数据库的核心原理与工程实践。内容涵盖CAP定理的动态…...

Zotero 快速参考文献导出(特定期刊引用)

目录 一、添加样式 每次投期刊时每种期刊的引用方式不一样,就很麻烦。发现zeotero添加期刊模板再导入很方便 一、添加样式 然后就能导出自己想要的期刊格式的引用了...

库的制作与原理(一)

1.库的概念 库是写好的,现成的可以复用的代码。本质上库是一种可执行的二进制形式,可以被操作系统载入内存执行。库有俩种:静态库 .a[Linux] .lib[windows] 动态库 .so[Linux] .dll[windows] 就是把.c文件变成.o文件,把…...

go 日志框架

内置log import ("log""os" )func main() {// 设置loglog.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)// 自定义日志前缀log.SetPrefix("[pprof]")log.Println("main ..")// 如果用format就用PrintF,而不是…...

JavaScript 最佳实践

我只选取了我还没完全贯彻的条目罗列如下. 1.函数命名 函数名由动词开头,如getName(); 2.布尔类型命名 若函数返回布尔值,则函数名以is/can等开头. 3.常量命名约定 常量名全大写并以下划线""连接. 4.变量类型透明化 定义变量时,应将其立即初使化为一个与其同类型…...

Rust配置笔记

1.Node.js下载配置 2.c环境配置 C我是用vs装的点击这个installer 点击修改 选择C环境就行,这个时候它就帮忙配置环境了 3.Rust下载配置 4.装napi-rs框架 npm install -g napi-rs/cliRust下载网站 下完之后直接打开 一开始下包会比较慢,多等等 下好之后跑项目前第一件事配置…...

大模型WebUI:Gradio全解12——LangChain原理及agents构建Gradio UI(1)

大模型WebUI:Gradio全解12——LangChain原理及agents构建Gradio UI(1) 前言本篇摘要12. LangChain原理及其agent构建Gradio UI12.1 LangChain介绍12.1.1 概念12.1.2 用途12.1.3 文档参考文献前言 本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易WebU…...

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)

整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…...

机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解

机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解 目录 引言 脑卒中的全球影响机器学习在医疗预测中的挑战类别不平衡问题的核心痛点数据预处理与特征选择 数据来源与清洗缺失值处理方法类别特征编码特征选择技术处理类别不平衡的四大方法 SMOTE(合成少数类过采样技术…...

数据表的存储过程和函数介绍

文章目录 一、概述二、创建存储过程三、在创建过程中使用变量四、光标的使用五、流程控制的使用六、查看和删除存储过程 一、概述 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可…...

为AI聊天工具添加一个知识系统 之117 详细设计之58 思维导图及观察者效应 之2 概念全景图

(说明:本文和上一篇问题基本相同,但换了一个模型 deepseek-r1) Q1227、在提出项目“为使用AI聊天工具的聊天者加挂一个专属的知识系统”后,我们已经进行了了大量的讨论-持续了近三个月了。这些讨论整体淋漓尽致体现了…...

Error [ERR_REQUIRE_ESM]: require() of ES Module

报错信息: 【报错】Message.js 导入方式不对,用的是 ES Moudle 的语法,提示使用 import 引入文件 项目开发没有用到 js-message 依赖,是 node-ipc 依赖中用到的 js-message 依赖, node-ipc 中限制 js-message 版本&a…...

GStreamer源码安装1.24版本

从官网下载 1.24的源码包 https://gitlab.freedesktop.org/gstreamer/gstreamer/-/tree/1.24?ref_typeheads#getting-started ,尝试过使用git clone 的方式,但速度贼慢,就选择了下载源码包的方式安装依赖 sudo apt install libssl-dev g me…...

从CNN到Transformer:遥感影像目标检测的未来趋势

文章目录 前言专题一、深度卷积网络知识专题二、PyTorch应用与实践(遥感图像场景分类)专题三、卷积神经网络实践与遥感影像目标检测专题四、卷积神经网络的遥感影像目标检测任务案例【FasterRCNN】专题五、Transformer与遥感影像目标检测专题六、Transfo…...

从 x86 到 ARM64:CPU 架构的进化与未来

在计算机发展的历史长河中,x86、x64 和 ARM64 这三大主流 CPU 架构各自书写了辉煌的篇章。它们不仅代表了技术的进步,更承载着无数创新者的梦想与努力。 x86:从 16 位到 32 位的辉煌之路 诞生与崛起 1978 年,英特尔(…...