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

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;
}

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("正常退出");
    g_pTHSplashScreen->show();//启动画面
	qApp->processEvents();//保证退出时候展示启动画面事件可运行 避免卡死
	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()函数。
      


文章转载自:

http://Sn4QcEkm.jtdzn.cn
http://EMkoVuHd.jtdzn.cn
http://hiOtr8uB.jtdzn.cn
http://4fLOQKLG.jtdzn.cn
http://hAOFpkBO.jtdzn.cn
http://CTS0Kvaj.jtdzn.cn
http://dotQSvlv.jtdzn.cn
http://6sXyoUzP.jtdzn.cn
http://hF2CWjhI.jtdzn.cn
http://066Cn9jq.jtdzn.cn
http://YeNM1dSi.jtdzn.cn
http://YQrGc9OD.jtdzn.cn
http://iZxmmllY.jtdzn.cn
http://ZCplE2ff.jtdzn.cn
http://NoH1fZcp.jtdzn.cn
http://AKJNM4jO.jtdzn.cn
http://5jYGDPYS.jtdzn.cn
http://EuwHYq8s.jtdzn.cn
http://raN0cMEO.jtdzn.cn
http://OdSXerE7.jtdzn.cn
http://LvY95Vtb.jtdzn.cn
http://21lm0tMg.jtdzn.cn
http://hUrQwWcb.jtdzn.cn
http://5V5xJMf3.jtdzn.cn
http://ej32OGLU.jtdzn.cn
http://jCD3n5BE.jtdzn.cn
http://RtjAMYTi.jtdzn.cn
http://stbiw0HL.jtdzn.cn
http://2SCyv654.jtdzn.cn
http://ajz18Fbw.jtdzn.cn
http://www.dtcms.com/a/28554.html

相关文章:

  • MySQL基础回顾#1
  • jQuery UI CSS 框架 API
  • PyTorch 系统教程:PyTorch 入门项目(简单线性回归)
  • 使用代码与 AnythingLLM 交互的基本方法和示例
  • 30天开发操作系统 第22天 -- 用C语言编写应用程序
  • 模型训练与优化遇到的问题3:安装STM32Cube.AI
  • Webpack的持久化缓存机制具体是如何实现的?
  • 【鸿蒙笔记-基础篇_状态管理】
  • scrapy pipelines过滤重复数据
  • Nginx WebSocket 长连接及数据容量配置
  • 文献阅读 250220-Convective potential and fuel availability complement near-surface
  • 10个Python 语法错误(SyntaxError)常见例子及解决方案
  • 2016年下半年软件设计师上午题的知识点总结(附真题及答案解析)
  • 后端Java Stream数据流的使用=>代替for循环
  • 接口测试-API测试中常用的协议(中)
  • 解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
  • 本地在ollama上部署deepseek或llama大模型
  • 2024华为OD机试真题-恢复数字序列(C++/Java/Python)-E卷-100分
  • Vue 中组件通信的方式有哪些,如何实现父子组件和非父子组件之间的通信?
  • 【含文档+PPT+源码】基于大数据的交通流量预测系统
  • 解决本地模拟IP的DHCP冲突问题
  • NutUI内网离线部署
  • 20250218反函数求导
  • IPv6报头40字节具体怎么分配的?
  • 快速入门Springboot+vue——MybatisPlus快速上手
  • 16 中介者(Mediator)模式
  • 编写测试计划的六大要素是什么
  • Python网络爬虫技术详解文档
  • 1. 面向对象编程:类/对象/继承/多态
  • 【微信小程序开发】元素顶部重叠