2012-04-09 8 views
6

यह प्रोग्राम सामान्य रूप से क्यों चलता है और मुख्य विंडो प्रदर्शित करता है? मुझे उम्मीद है कि quit() को कन्स्ट्रक्टर में बुलाया गया है।निष्पादन() से पहले कॉलिंग() को छोड़ने से पहले आवेदन क्यों नहीं छोड़ता है?

main.cpp:

#include<QApplication> 
#include"MainWindow.h" 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWindow; 
    mainWindow.show(); 
    return app.exec(); 
} 

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    qApp->quit(); 
} 

void MainWindow::closeEvent(QCloseEvent *) 
{ 
    qDebug("Hello world!"); 
} 

उत्तर

7

QCoreApplication::quit() कॉलिंग QCoreApplication::exit(0) कॉल करने जैसा ही है।

यदि आप बाद समारोह के docs को देखें, तो:

इस समारोह के बाद कहा गया है, आवेदन मुख्य घटना पाश और रिटर्न कॉल से exec करने के लिए छोड़ देता है()। Exec() फ़ंक्शन रिटर्न वापसी देता है। यदि ईवेंट लूप नहीं चल रहा है, तो यह फ़ंक्शन कुछ भी नहीं करता है।

आप उदाहरण में, घटना पाश अभी तक शुरू नहीं किया गया है जब MainWindow रों निर्माता कहा जाता है, इसलिए quit() करने के लिए कॉल कुछ नहीं करता है।

+0

अच्छा सहायता के लिए धन्यवाद। – user1318674

6

चूंकि QCoreApplication::quit() ईवेंट लूप शुरू होने तक एक नो-ऑप है, तो आपको कॉल शुरू होने तक कॉल को स्थगित करने की आवश्यकता है। इस प्रकार, एक स्थगित विधि कतार quit() पर कॉल करें।

निम्नलिखित लाइनों functionally identical कर रहे हैं, या तो एक काम करेंगे:

QTimer::singleShot(0, qApp, &QCoreApplication::quit); 
//or 
QTimer::singleShot(0, qApp, SLOT(quit())); 
// or - see https://stackoverflow.com/a/21653558/1329652 
postToThread([]{ QCoreApplication::quit(); }); 
// or 
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); 
संबंधित मुद्दे