2015-08-26 44 views
0

我有一個QMainWindow用於瀏覽和查看圖像。這些圖像是使用我寫的包裝紙閱讀的特殊醫學圖像。當主窗口關閉時QApplication不會退出

GUI的左側有一個QListview,它顯示縮略圖列表。當用戶選擇其中的一個時,QVTKWidget在右側顯示相應的圖像。我使用vtkRenderWindowInteractor來操作顯示的圖像。

我主要如下所示:

#include <QApplication> 
#include "GUIClassName.h" //inherits from QMainWindow 
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    GUIClassName w; 
    w.show(); 
    return a.exec(); 
} 

我的closeEvent如下所示:

void GUIClassName::closeEvent(QCloseEvent* event) 
{ 
    // mainInteractor is a vtkSmartPointer<vtkRenderWindowInteractor>  
    if (this->_mainInteractor != NULL) 
     this->_mainInteractor->TerminateApp(); 
    event->accept(); 
} 

的問題是,當我關閉QMainWindow中,應用程序不會終止。即命令提示符保持打開並且按任意鍵繼續不會出現。如果我CTRL + BREAK,然後退出應用程序(明顯),但我得到了以下信息:

的QObject ::〜QObject的:定時器不能從另一個線程停止

我已經注意到,如果我只選擇一個縮略圖並將其顯示在QVTKWidget中,程序結束就好了。但是,當我選擇一個縮略圖時,顯示它並選擇另一個縮略圖,然後當我關閉該窗口時程序不會終止。

我想知道如果有人能告訴我我在這裏做錯了什麼。我很樂意複製/粘貼更多的代碼,但我不確定目前哪些部分是相關的。

我已閱讀在回答希望以下,但到目前爲止,我已經無法來解決這個問題:

Qt app stays in memory even after MainWindow is closed

Qt process stays in memory after application closes

C++ application does not kill all processes on exit

感謝

回答

0

RazrFalcon給了我一個很好的提示。我還不是Qt的專家,所以我一直在尋找在所有錯誤的地方被執行的Qthread。

答案在於vtkRenderWindowInteractor類。對於大多數vtkObjects(如果我沒有弄錯),在vtkSmartPointer上調用new將刪除/停止對象(如果它已經存在)。但是,這不會發生在vtkRenderWindowInteractor中。

解決方案如下。當縮略圖之間切換,我不得不檢查交互器的存在,如果它正在運行,我只想叫

this->_mainInteractor->TerminateApp(); 

停止隱藏的QThread。

0

你停止了所有的線程嗎? 我不熟悉VTK,但看起來像有人在線程中運行一些代碼,並沒有正確地阻止它們。

+0

我不認爲我明確地啓動任何線程,但我可能會隱式創建/啓動一個線程。我將編輯我的問題以提供更多信息。 – siavashk

相關問題