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

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

  • 相关阅读:
    Java-GZIPOutputStream踩坑
    Redis事务
    Netty实现简单群聊
    SpringMVC请求参数解析
    Netty实现WebSocket
    SpringBoot项目war包部署
    NIO实现群聊
    SpringMVC请求映射handler源码解读
    SpringMVC自定义兼容性HandlerMapping
    spring boot自定义类配置绑定在配置文件中自动提示
  • 原文地址:https://www.cnblogs.com/findumars/p/6440824.html
Copyright © 2020-2023  润新知