主窗口关闭时,QApplication不会退出

时间:2015-08-26 00:28:21

标签: c++ qt qlistview qtimer

我有一个用于浏览和查看图像的QMainWindow。这些图像是使用我写的包装器读取的特殊医学图像。

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

由于

2 个答案:

答案 0 :(得分:0)

你停止了所有线程吗? 我对VTK并不熟悉,但看起来有人在线程中运行了一些代码而没有正确阻止它们。

答案 1 :(得分:0)

RazrFalcon给了我一个很好的暗示。我不是Qt的专家(还),所以我一直在寻找在错误的地方执行的Qthread。

答案在于vtkRenderWindowInteractor类。对于大多数vtkObjects(如果我没有记错的话),在vtkSmartPointer上调用new会删除/停止对象(如果它已经存在)。但是,vtkRenderWindowInteractor不会发生这种情况。

解决方案如下。在缩略图之间切换时,我必须检查是否存在交互器,如果它正在运行,我只需要调用

    this->_mainInteractor->TerminateApp();

停止隐藏的Qthread。