標籤:
一、簡介
最近因項目需求,Qt程式一旦檢測到錯誤,要重新啟動,自己是每次關閉主視窗的所有子視窗但有些模態框會出現問題,因此從網上總結了一些知識點,以備以後的應用。
二、詳解1、Qt結構
[cpp] view plaincopy
- 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視窗:
[cpp] view plaincopy
- 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視窗:
[html] view plaincopy
- 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啟動當前程式的另一個進程,這兩個程式沒有父子關係。
點擊重啟按鈕,其槽中內容
[cpp] view plaincopy
- void MyWidget::slotButton()
- {
- qApp->closeAllWindows();
- QProcess::startDetached(qApp->applicationFilePath(), QStringList());
- }
也可以使用QProcess::startDetached(qApp->applicationFilePath());但要保證路徑中不包括空格也無參數。
qApp->quit();與qApp->closeAllWindows();都可以使用,只是看是否接受close事件。
(4)重啟程式之二
在上述的槽中書寫:
[cpp] view plaincopy
- void MyWidget::slotButton()
- {
- // qApp->closeAllWindows();
- // QProcess::startDetached(qApp->applicationFilePath(), QStringList());
- qApp->exit(0);
- }
在main函數中
[cpp] view plaincopy
- 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]
http://blog.csdn.net/taiyang1987912/article/details/39058775
Qt淺談之二十App自動重啟及關閉子視窗(六種方法)