主窗口关闭时 QApplication 不退出

Posted

技术标签:

【中文标题】主窗口关闭时 QApplication 不退出【英文标题】:QApplication does not exit when main window closes 【发布时间】:2015-08-26 00:28:21 【问题描述】:

我有一个用于浏览和查看图像的 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 时,应用程序并没有终止。也就是说,命令提示符保持打开状态,Press any key to continue 不会出现。如果我 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

谢谢

【问题讨论】:

【参考方案1】:

您是否停止了所有线程? 我不熟悉VTK,但看起来有人在线程中运行了一些代码并且没有正确停止它们。

【讨论】:

我不认为我明确地启动了任何线程,但我可能会隐式地创建/启动一个。我将编辑我的问题以提供更多信息。【参考方案2】:

RazrFalcon 给了我一个很好的提示。我还不是 Qt 专家,所以我一直在寻找在所有错误位置执行的 Qthread。

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

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

    this->_mainInteractor->TerminateApp();

停止隐藏的Qthread。

【讨论】:

以上是关于主窗口关闭时 QApplication 不退出的主要内容,如果未能解决你的问题,请参考以下文章

在QT中关闭窗口之前获取应用程序退出信号

wpf关闭主窗口询问“退出”的问题

禁用主窗口的标题上下文菜单

关闭并退出时崩溃

c#里面如何显示下一个窗体而关闭当前窗体?

如何将一个 qApplication 的 GUI 嵌入到另一个 qApplication 的主窗口中?