Qt淺談之二十App自動重啟及關閉子視窗(六種方法)

來源:互聯網
上載者:User

標籤:

一、簡介

      最近因項目需求,Qt程式一旦檢測到錯誤,要重新啟動,自己是每次關閉主視窗的所有子視窗但有些模態框會出現問題,因此從網上總結了一些知識點,以備以後的應用。

二、詳解1、Qt結構

 

[cpp] view plaincopy 
  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 
  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 
  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 
  1. void MyWidget::slotButton()  
  2. {  
  3. //    qApp->closeAllWindows();  
  4. //    QProcess::startDetached(qApp->applicationFilePath(), QStringList());  
  5.       qApp->exit(0);  
  6. }  

 

在main函數中

 

[cpp] view plaincopy 
  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)本人思路有限,若有更好的設計建議,也可發郵件溝通,在此先感謝!郵箱地址[email protected]

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

Qt淺談之二十App自動重啟及關閉子視窗(六種方法)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.