2012-12-21 16 views
2

在我的應用程序中,我有一個托盤圖標,因此我忽略了closeEvent,以便應用程序在發生某些情況時「最小化」。但是,我確實希望在按退出時,應用程序將完全退出。但是,在重寫closeEvent並調用函數quit()之後,它似乎繞過了MainWindow析構函數,在那裏我有一些代碼。 我在closeEvent中錯過了什麼來正確關閉應用程序,以便調用MainWindow的析構函數,就像closeEvent未被覆蓋時一樣?QT退出不調用MainWindow析構函數

我使用

QMainWindow::closeEvent(event); 

和其他一些東西試過,但析構函數永遠不會被調用。

我接近事件的實現是:

void MainWindow::closeEvent(QCloseEvent * event) 
{ 
    if(m_closeCompletely == false) 
    { 
     if (trayIcon->isVisible()) 
     { 
      QMessageBox::information(this, tr("Hello"), 
            tr("The program will keep running in the " 
             "system tray. To terminate the program, " 
             "choose <b>Quit</b> in the context menu " 
             "of the system tray entry.")); 
     } 
    } 
    else 
    { 
     event->accept(); 
    } 
} 
+0

你能展示一些更多的上下文嗎?你是如何實現'closeEvent()'的?你是否從文檔中嘗試了樣本? http://doc-snapshot.qt-project.org/4.8/qwidget.html#closeEvent –

回答

2

這一切都取決於你如何分配你正在使用的對象。如果你在堆上創建了QApplicationQMainWindow,那麼它們將潛伏,直到OS清理內存。發送close()QWidget(和QMainWindow是其中之一)將只有close它..從用戶的視覺上隱藏它。你以後可以show()close()不會破壞它。

你可以使用這樣的事情:

int main(int argc, char* argv[]) { 

    QApplication app(argc, argv); 

    MyMainWindow mw; 
    mw.show(); 

    int rc = app.exec(); 

    // optional: do_cleanup(); 

    return rc; 
} 

appmw構造堆棧。當appexec()呼叫返回時(通常當您將quit()發送到QCoreApplication::instance()時),它們將以相反順序銷燬。你甚至可以提供一個簡單的清理函數,不需要將某些東西放入UI的析構函數中。

+0

它們都是在struct中構造的。也許我應該採納你的建議並避免使用解構器。 –

+0

什麼是結構? – akira

0

請記住,所有應用程序資源都由QApplication持有;

一旦您的MainWindow關閉,它就是close,也就是隱藏在屏幕上;

我不知道你爲什麼要析構函數您MainWindow,看來你已經有了一個系統托盤項,所以我的建議只是爲了隱藏MainWindow析構函數,原因是有系統托盤,您可能需要點擊它才能顯示MainWindow

希望有所幫助。 :)

0

我剛剛遇到了同樣的問題,這是因爲我正在運行一個永遠不允許應用程序關閉的無限循環。

forever 
{ 
    _runGameLoop(); 
} 

我不得不作出循環結束時MainWindow關閉

while(!M->isClosed()) 
{ 
    _runGameLoop(); 
} 

當然,我不得不實施isClosed()

bool MainWindow::isClosed() 
{ 
    return _isClosed; 
} 

void MainWindow::closeEvent(QCloseEvent*) 
{ 
    _isClosed = true; 
} 
3

的WA_DeleteOnClose屬性需要被設置爲調用析構函數在關閉事件中,否則小部件或窗口只是隱藏起來。將以下內容添加到類構造函數中:

this->setAttribute(Qt::WA_DeleteOnClose); 

這將導致在關閉事件時調用析構函數。

相關問題