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)主界面的退出

Qt浅谈之二十App自动重启及关闭子窗口_第1张图片Qt浅谈之二十App自动重启及关闭子窗口_第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(obj)) {
           QObjectList list_son = qobject_cast(obj)->children();
           foreach(QObject *obj_son, list_son) {
               if (qobject_cast(obj_son)) {
                   qobject_cast(obj_son)->close();
               }
           }
           qobject_cast(obj)->close();
       }
   }

只关闭所有的QDialog窗口:

 QObjectList list = this->children();
        foreach(QObject *obj, list) {
            if (qobject_cast(obj)) {
                QObjectList list_son = qobject_cast(obj)->children();
                foreach(QObject *obj_son, list_son) {
                    if (qobject_cast(obj_son)) {
                        qobject_cast(obj_son)->close();
                    }
                }
                qobject_cast(obj)->close();
            }
        }

(3)重启程序之一

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

Qt浅谈之二十App自动重启及关闭子窗口_第3张图片

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

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)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址[email protected]


你可能感兴趣的:(LinuxQt编程)