App自重启及关闭子窗口

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

主窗口右下角的退出

      方式一: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<QWidget *>(obj)) {  
        QObjectList list_son = qobject_cast<QWidget *>(obj)->children();  
        foreach(QObject *obj_son, list_son) {  
            if (qobject_cast<QWidget *>(obj_son)) {  
                qobject_cast<QWidget *>(obj_son)->close();  
            }  
        }  
        qobject_cast<QWidget *>(obj)->close();  
    }  
}  

只关闭所有的QDialog窗口:

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

3.重启程序之一

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

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

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的判断值要一样才能重启动。

猜你喜欢

转载自blog.csdn.net/lengyuezuixue/article/details/81226712