一、简介

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

二、详解

1、Qt结构

  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窗口:

  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窗口:

  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启动当前程序的另一个进程,这两个程序没有父子关系。

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

  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)重启程序之二

在上述的槽中书写:

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

在main函数中

  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)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址yang.ao@i-soft.com.cn

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

Qt浅谈之二十App自动重启及关闭子窗口(六种方法)的更多相关文章

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

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

  2. Qt浅谈之二十六图片滑动效果

    一.简介 博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码.并加上类似mac的画面移动的动画效果. 二.详解 1.代码一:界面滑动(QWidget) (1)slid ...

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

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

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

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

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

    一.简单介绍 近期因调试code时,想了解程序的流程,但苦于没有一个简易的日志记录,不停使用qDebug打印输出,而终于提交代码时得去多次删除信息打印,有时还会出现新改动的代码分不清是哪些部分.而使用 ...

  6. Qt浅谈之二:钟表(时分秒针)

    一.简介 QT编写的模拟时钟,demo里的时钟只有时针和分针,在其基础上添加了秒针,构成了一个完整的时钟.能对2D绘图中坐标系统.平移变换(translate).比例变换(scale).旋转变换(ro ...

  7. Qt浅谈内存泄露(总结)

    Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...

  8. Qt浅谈之总结(整理)

    Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...

  9. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

随机推荐

  1. 《Programming WPF》翻译 第7章 4.转换

    原文:<Programming WPF>翻译 第7章 4.转换 支持高分辨率显示是WPF中的重要样式.这是被部分地支持--强调了可伸缩的向量图,而不是图像.但是,正如使用GDI+和GDI3 ...

  2. 解决kibana 4 关于响应时间的问题

    "message" => " 10.252.142.174 [12/Sep/2016:16:43:47 +0800] \"GET /resources/j ...

  3. 利用jquery表格添加一行并在每行第一列大写字母显示实现方法

    表格添加一行并在每行第一列大写字母显示jquery实现方法 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  4. UVA 10285 Longest Run on a Snowboard(记忆化搜索)

    Problem C Longest Run on a Snowboard Input: standard input Output: standard output Time Limit: 5 sec ...

  5. SEXTANTE中调用任意C++控制台程序的简单例子

    在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...

  6. web项目的两个创建形式website和webapplication

    前言 在利用VS2010创建web项目的时候,会有两个选择.可以选择直接创建website网站,还可以选择使用 webapplication应用程序.刚刚接触web开发,看到这两个就疑惑了,既然是都可 ...

  7. boost库asio详解1——strand与io_service区别

    namespace { // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::a ...

  8. Linux :: vi E212: Can't open file for writing

    Linux :: vi E212: Can't open file for writing sysct1.conf 可能无写权限!查看方法:ls -lh /etc/sysct1.conf如果没有,则c ...

  9. 使用安卓中的TextToSpeech控件实现朗读文字

    首先感谢原文的博主,本文中的代码均来自该博主:(原文地址)http://flycatdeng.iteye.com/blog/1827245 朗读文字不需要任何的权限,这个控件的好处是首先不要权限,其次 ...

  10. EasyuiCombobox三级联动

    有许多刚接触Easyui中Combobox控件的朋友可能都会遇到的问题:如何将Combobox做成三级联动? 先本人有个三级联动的案例给大家参考参考,经测试能通过.注意Combobox绑定的数据是Js ...