Qt浅谈之二十App自动重启及关闭子窗口

一、简介

最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用。

二、详解

1、Qt结构

[cpp] view plain copy

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. MyWidget w;
  5. MyDialog dialog;                      //新建MyDialog类对象
  6. if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果
  7. w.show();                         //如果是按下了“进入主界面”按钮,则显示主界面
  8. return a.exec();                  //程序正常运行
  9. }
  10. else return 0;                        //否则,退出程序
  11. }

执行到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窗口:

[cpp] view plain copy

  1. QObjectList list = MainWindow->children();
  2. foreach(QObject *obj, list) {
  3. if (qobject_cast<QWidget *>(obj)) {
  4. QObjectList list_son = qobject_cast<QWidget *>(obj)->children();
  5. foreach(QObject *obj_son, list_son) {
  6. if (qobject_cast<QWidget *>(obj_son)) {
  7. qobject_cast<QWidget *>(obj_son)->close();
  8. }
  9. }
  10. qobject_cast<QWidget *>(obj)->close();
  11. }
  12. }

只关闭所有的QDialog窗口:

[html] view plain copy

  1. QObjectList list = this->children();
  2. foreach(QObject *obj, list) {
  3. if (qobject_cast<QDialog *>(obj)) {
  4. QObjectList list_son = qobject_cast<QDialog *>(obj)->children();
  5. foreach(QObject *obj_son, list_son) {
  6. if (qobject_cast<QDialog *>(obj_son)) {
  7. qobject_cast<QDialog *>(obj_son)->close();
  8. }
  9. }
  10. qobject_cast<QDialog *>(obj)->close();
  11. }
  12. }

(3)重启程序之一

使用QProcess启动当前程序的另一个进程,这两个程序没有父子关系。

点击重启按钮,其槽中内容

[cpp] view plain copy

  1. void MyWidget::slotButton()
  2. {
  3. qApp->closeAllWindows();
  4. QProcess::startDetached(qApp->applicationFilePath(), QStringList());
  5. }

也可以使用QProcess::startDetached(qApp->applicationFilePath());但要保证路径中不包括空格也无参数。

qApp->quit();与qApp->closeAllWindows();都可以使用,只是看是否接受close事件。

(4)重启程序之二

在上述的槽中书写:

[cpp] view plain copy

  1. void MyWidget::slotButton()
  2. {
  3. //    qApp->closeAllWindows();
  4. //    QProcess::startDetached(qApp->applicationFilePath(), QStringList());
  5. qApp->exit(0);
  6. }

在main函数中

[cpp] view plain copy

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4. int ret;
  5. MyWidget w;
  6. MyDialog dialog;
  7. //新建MyDialog类对象
  8. if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果
  9. w.show();                         //如果是按下了“进入主界面”按钮,则显示主界面
  10. ret =  a.exec();                  //程序正常运行
  11. }
  12. else return 0;                        //否则,退出程序
  13. if (ret == 0) {
  14. QProcess::startDetached(qApp->applicationFilePath(), QStringList());
  15. return 0;
  16. }
  17. return ret;
  18. }

注意exit的返回值与ret的判断值要一样才能重启动。

三、总结

(1)本人喜欢使用重启程序之一,位置简单,在需要重启的地方直接加入就行。

(2)本次测试代码比较简单,暂不上传,需要的可以联系。

(3)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址[email protected]。

http://blog.csdn.net/taiyang1987912/article/details/39058775

时间: 2024-10-12 14:08:14

Qt浅谈之二十App自动重启及关闭子窗口的相关文章

Qt浅谈之二十App自动重启及关闭子窗口(六种方法)

一.简介 最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用. 二.详解 1.Qt结构 [cpp] view plaincopy int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget w; MyDialog dialog;                      //新建MyDialog类对象 if(dia

Qt浅谈之二十七进程间通信之QtDBus

一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DBus分为两种类型:system bus(系统总线),用于系统(Linux)和用户程序之间进行通信和消息的传递:session bus(回话总线),用于桌面(GNOME, KDE等)用户程序之间进行通信. 二.详解之Qt代码 1.代码一 (1)test.h [html] view plain copy

Qt浅谈之二十一log调试日志

一.简介 最近因调试code时,想了解程序的流程,但苦于没有一个简易的日志记录,不停使用qDebug打印输出,而最终提交代码时得去多次删除打印信息,有时还会出现新修改的代码分不清是哪些部分.而使用#ifdef _DEBUG又比较烦这套,因此写了些简单的日志,方便排除问题,暂时不能用于多线程中,以后需要再补充. 二.详解 1.追踪函数 #ifdef _DEBUG_PRINT #define DEBUGPRINT DEBUGInfo printinfo(__FILE__, __LINE__, __F

Qt浅谈之二:钟表(时分秒针),QSplitter实现自由伸缩滑动窗口 good

http://blog.csdn.net/taiyang1987912/article/details/30272105 http://blog.csdn.net/taiyang1987912/article/details/50717179 http://blog.csdn.net/taiyang1987912/article/category/2314763

Qt浅谈之十六:TCP和UDP(之一)

一.简介 Qt使用QtNetwork模块来进行网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐(因有时需引用底层操作系统的相关数据结构).有较底层次的类如QTcpSocket.QTcpServer和QUdpSocket等来表示低层的网络概念:还有高层次的类如QNetworkRequest.QNetworkReply和QNetworkAccessManager使用相同的协议来执行网络操作:也提供了QNetworkConfiguration.QNetw

Qt浅谈内存泄露(总结)

Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除. C++中delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大.Qt中使用

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了<Core Data浅谈系列汇总>,今天稍微回顾了下,做些补充. 在这个系列的第一篇<基础结构>中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute: 数据类型.布尔值统一用NSNumber来表示: 字符串类型用NSString表示: 时间类型用NSDate表示: 二进制数据类型用NSData表示: 非标准类型用Transformable来表示: 而Attribute还有其自身的Properties,比如Transient表示不用持久化

浅谈DevExpress&lt;二&gt;:设计一个完整界面(2)

下面来把剩下的工作做完,换肤功能昨天已近讨论过,今天就不重复了.首先建立三个全局变量,一个存放文件路径,一个存放数据,一个存放过滤条件. string DBFileName; DataView dataView; string[] filter = new string[3]; 取得数据并绑定到表格中: DBFileName = DevExpress.Utils.FilesHelper.FindingFileName(Application.StartupPath, "Products.xml&

浅谈DevExpress&lt;二&gt;:设计一个完整界面(1)

昨天谈了界面的换肤问题,今天拿一个简单的界面来介绍一下怎么设计一个五脏俱全的界面,总体效果如下图(种类的图片随便找的^^): 创建一个winform项目,在上面拉进去一个bar管理器和图片列表: 在菜单栏.工具栏和状态栏中,分别加入菜单.编辑栏.按钮和静态文本: 菜单栏改名并设置好图片: 然后改工具栏项的属性,拿第一个举个例子,后面的大同小异,选择EditItem后先将其PaintStyle属性改为CapationGlyph,然后找到Edit,选择CheckEdit,就会变成下面的样子: 依法炮