2016-01-22 80 views
0

我試圖使用qApp-> exit()退出應用程序並關閉UI。但是我失敗了,在qApp-> exit()執行後,UI仍然存在。任何人都可以幫忙弄清楚爲什麼?非常感謝。QT:如何退出應用程序並關閉UI

#include "clsDownloadUpdateList.h" 
#include <QApplication> 
#include <qtranslator.h> 
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTranslator translator; 
    translator.load("en-CN_upgrader"); 
    qApp->installTranslator(&translator); 
    clsDownloadUpdateList w; 
    w.show(); 

    return a.exec(); 
} 

clsDownloadUpdateList::clsDownloadUpdateList(QWidget *parent) : 
    QMainWindow(parent), 
    _state(STOP), 
    ui(new Ui::clsDownloadUpdateList) 
{ 
    ui->setupUi(this); 
    this->setWindowTitle("GCS Upgrader"); 
// other code 
// here comes the code to exit application 
      qApp->exit(); 
// but the UI is still there. 
} 
+3

你似乎調用'qApp- >在'a.exec()'前退出()'。 – thuga

回答

2

@thuga是對的。您所遇到的問題是由錯誤代碼引起的:您在構造函數中正確調用qApp->exit(),應用程序尚未啓動它的消息循環(由a.exec())。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTranslator translator; 
    translator.load("en-CN_upgrader"); 
    qApp->installTranslator(&translator); 
    clsDownloadUpdateList w; // <- you call qApp->exit() right here, before a.exec(); 
    w.show(); 

    return a.exec(); 
} 
+0

謝謝!現在我明白爲什麼它不起作用。我想退出應用程序的原因是在構造函數代碼中,我沒有檢查是否使用QsharedMemory打開了另一個相關的應用程序。在這種情況下,如果相關的應用程序被打開。它將打開一個對話框,告訴用戶其他應用程序已打開以及是否要關閉此應用程序。一旦他點擊「是」,它將退出應用程序。所以在這種情況下,我應該在哪裏實現這種檢查Qsharememory並退出應用程序邏輯?在main中,可能在clsDownloadUpdateList之後;但在w.show()之前?謝謝 –

+0

我理解你的目標是錯的嗎? - 您希望此應用程序檢查某個相關應用程序是否已在運行。如果它已經在運行 - 顯示對話框中有一個問題「是否要關閉相關的應用程序?(是,否)」 - 如果「是」 - 關閉它? –

+0

是的,維克多你完全理解我。那麼我應該在哪裏實現這個邏輯? –

1

它不會幫助你在構造函數中,因爲沒有事件循環開始。

在這種情況下,您可以使用QTimer :: singleShot(),其超時值等於零。它會導致在事件循環開始時調用你需要的東西。此外,它是使用初始化方法,並檢查它的主要不錯的主意:

Window w; 
if (!w.init()) 
    return 1; 
w.show(); 
return a.exec(); 
0

工作代碼:

#include <QMetaObject> 
//... 
QMetaObject::invokeMethod(qApp, "quit", 
    Qt::QueuedConnection); 

或爲小部件:

QMetaObject::invokeMethod(this, "close", 
    Qt::QueuedConnection); 
相關問題