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


    一、简介

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

    二、详解

    1、Qt结构

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    1. void MyWidget::slotButton()  
    2. {  
    3. //    qApp->closeAllWindows();  
    4. //    QProcess::startDetached(qApp->applicationFilePath(), QStringList());  
    5.       qApp->exit(0);  
    6. }  

    在main函数中

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/findumars/p/4969772.html
Copyright © 2020-2023  润新知