Qt浅谈之二十App自动重启及关闭子窗口(六种方法)
一、简介
最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用。
二、详解
1、Qt结构
- int main(int argc, char *argv[])
 - {
 - QApplication a(argc, argv);
 - MyWidget w;
 - MyDialog dialog; //新建MyDialog类对象
 - if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果
 - w.show(); //如果是按下了“进入主界面”按钮,则显示主界面
 - return a.exec(); //程序正常运行
 - }
 - else return 0; //否则,退出程序
 - }
 
执行到a.exec()才能启动主线程的事件循环,退出循环既要退出这个事件循环返回a.exec()的值或者0。
(2)主界面的退出
主窗口右下角的退出方式一:QCoreApplication::exit(0);0是状态还可以是其他的值。
方式二:QCoreApplication::quit();
方式三:QApplication::exit(0);QApplication是继承QCoreApplication的。
方式四:QApplication::quit();
方式五:close();QApplicatio有个常用属性qApp->quitOnLastWindowClosed(true);当最后一个窗口关闭时自动调用前面的exit()。
方式六:QApplication::closeAllWindows();关闭多个窗口,比调用quit好,因为窗口可以接受到close事件。
当然也可以循环关闭所有的QWidget窗口:
- QObjectList list = MainWindow->children();
 - foreach(QObject *obj, list) {
 - if (qobject_cast<QWidget *>(obj)) {
 - QObjectList list_son = qobject_cast<QWidget *>(obj)->children();
 - foreach(QObject *obj_son, list_son) {
 - if (qobject_cast<QWidget *>(obj_son)) {
 - qobject_cast<QWidget *>(obj_son)->close();
 - }
 - }
 - qobject_cast<QWidget *>(obj)->close();
 - }
 - }
 
只关闭所有的QDialog窗口:
- QObjectList list = this->children();
 - foreach(QObject *obj, list) {
 - if (qobject_cast<QDialog *>(obj)) {
 - QObjectList list_son = qobject_cast<QDialog *>(obj)->children();
 - foreach(QObject *obj_son, list_son) {
 - if (qobject_cast<QDialog *>(obj_son)) {
 - qobject_cast<QDialog *>(obj_son)->close();
 - }
 - }
 - qobject_cast<QDialog *>(obj)->close();
 - }
 - }
 
(3)重启程序之一
使用QProcess启动当前程序的另一个进程,这两个程序没有父子关系。
点击重启按钮,其槽中内容
- void MyWidget::slotButton()
 - {
 - qApp->closeAllWindows();
 - QProcess::startDetached(qApp->applicationFilePath(), QStringList());
 - }
 
也可以使用QProcess::startDetached(qApp->applicationFilePath());但要保证路径中不包括空格也无参数。
qApp->quit();与qApp->closeAllWindows();都可以使用,只是看是否接受close事件。
(4)重启程序之二
在上述的槽中书写:
- void MyWidget::slotButton()
 - {
 - // qApp->closeAllWindows();
 - // QProcess::startDetached(qApp->applicationFilePath(), QStringList());
 - qApp->exit(0);
 - }
 
在main函数中
- int main(int argc, char *argv[])
 - {
 - QApplication a(argc, argv);
 - int ret;
 - MyWidget w;
 - MyDialog dialog;
 - //新建MyDialog类对象
 - if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果
 - w.show(); //如果是按下了“进入主界面”按钮,则显示主界面
 - ret = a.exec(); //程序正常运行
 - }
 - else return 0; //否则,退出程序
 - if (ret == 0) {
 - QProcess::startDetached(qApp->applicationFilePath(), QStringList());
 - return 0;
 - }
 - return ret;
 - }
 
注意exit的返回值与ret的判断值要一样才能重启动。
三、总结
(1)本人喜欢使用重启程序之一,位置简单,在需要重启的地方直接加入就行。
(2)本次测试代码比较简单,暂不上传,需要的可以联系。
(3)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址yang.ao@i-soft.com.cn
http://blog.csdn.net/taiyang1987912/article/details/39058775
Qt浅谈之二十App自动重启及关闭子窗口(六种方法)的更多相关文章
- Qt浅谈之二十App自动重启及关闭子窗口
		
一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 int ma ...
 - Qt浅谈之二十六图片滑动效果
		
一.简介 博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码.并加上类似mac的画面移动的动画效果. 二.详解 1.代码一:界面滑动(QWidget) (1)slid ...
 - Qt浅谈之二十七进程间通信之QtDBus
		
一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性. DB ...
 - Qt浅谈之二十七进程间通信之QtDBus good
		
一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性. DB ...
 - Qt浅谈之二十一log调试日志
		
一.简单介绍 近期因调试code时,想了解程序的流程,但苦于没有一个简易的日志记录,不停使用qDebug打印输出,而终于提交代码时得去多次删除信息打印,有时还会出现新改动的代码分不清是哪些部分.而使用 ...
 - Qt浅谈之二:钟表(时分秒针)
		
一.简介 QT编写的模拟时钟,demo里的时钟只有时针和分针,在其基础上添加了秒针,构成了一个完整的时钟.能对2D绘图中坐标系统.平移变换(translate).比例变换(scale).旋转变换(ro ...
 - Qt浅谈内存泄露(总结)
		
Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...
 - Qt浅谈之总结(整理)
		
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
 - 示例浅谈PHP与手机APP开发,即API接口开发
		
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
 
随机推荐
- Red Hat Enterprise Linux 7的新功能
			
 简介红帽最新版本的旗舰平台交付显著增强的可用性. 性能和可靠性. 丰富的新功能为架构. 系统管理员和开发人员提供所需的资源以更高效地进行创新和管理.架构师: 红帽® 企业 Linux® 7 适合 ...
 - c++ 08
			
一.程序的错误 1.编码错误:编译阶段 2.设计错误:测试阶段 3.环境错误:使用阶段 4.应用错误:测试和使用阶段 二.错误处理机制 1.通过返回值处理错误 当一个函数在执行过程中发生了某种错误,通 ...
 - postGreSQL数据库部署及简单使用
			
1,deployByRuiyIns rpm -ivh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.no ...
 - 相似文档查找算法之 simHash 简介及其 java 实现 - leejun_2005的个人页面 - 开源中国社区
			
相似文档查找算法之 simHash 简介及其 java 实现 - leejun_2005的个人页面 - 开源中国社区 相似文档查找算法之 simHash 简介及其 java 实现
 - [Immutable,js] Immutable.Record() as data models
			
The Immutable.js Record() allows you to model your immutable data much like you would model data wit ...
 - VS2008下编译boost_1_47_0
			
1,boost下载 如果不想自己编译,可下载http://boostpro.com/download/boost_1_47_setup.exe,安装后,程序会提供选项供下载已经编译好的库文件,基于 ...
 - Android应用切换皮肤功能实现(二)
			
原文地址http://www.apkbus.com/forum.php?mod=viewthread&tid=149034&highlight=%E7%9A%AE%E8%82%A4 上 ...
 - mysql免安装版配置与使用方法
			
mysql免安装版配置与使用方法 以mysql-noinstall-5.1.6(win32)为例 1>把压缩文件mysql-noinstall-5.1.6-alpha-win32.zi ...
 - 在后台操作标记的runat="server"的html标签
			
价格: <input id="tbPrice" type="text" runat="server" /> HtmlInputT ...
 - border-radius实例1
			
简单参数设置一 1.html <div class="paddingBig"> <div class="divSmall radiusOne" ...