QApplication 在 main window 关闭时不退出
QApplication does not exit when main window closes
我有一个用于浏览和查看图像的 QMainWindow。这些图像是使用我编写的包装器读取的特殊医学图像。
GUI 左侧有一个 QListview,它显示缩略图列表。当用户 select 是其中之一时,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();
}
我的关闭事件如下所示:
void GUIClassName::closeEvent(QCloseEvent* event)
{
// mainInteractor is a vtkSmartPointer<vtkRenderWindowInteractor>
if (this->_mainInteractor != NULL)
this->_mainInteractor->TerminateApp();
event->accept();
}
问题是当我关闭 QMainWindow 时,应用程序没有终止。也就是说,命令提示符保持打开状态,按任意键继续 不会出现。如果我按 Ctrl+break,则应用程序退出(显然)但我收到以下消息:
QObject::~QObject: Timers cannot be stopped from another thread
我注意到,如果我只 select 一个缩略图并将其显示在 QVTKWidget 中,程序就会正常终止。但是当我 select 一个缩略图显示它然后 select 另一个缩略图时,当我关闭 window.
时程序不会终止
我想知道是否有人可以告诉我我在这里做错了什么。我很乐意 copy/paste 更多代码,但目前我不确定哪些部分是相关的。
我已经阅读了以下内容,希望得到答案,但到目前为止我一直无法解决这个问题:
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
谢谢
您是否停止了所有线程?
我不熟悉 VTK,但看起来有人 运行 线程中的一些代码并没有正确停止它们。
RazrFalcon 给了我很好的提示。我还不是 Qt 专家,所以我一直在寻找在所有错误位置执行的 Qthread。
答案就在 vtkRenderWindowInteractor class 中。对于大多数 vtkObjects(如果我没记错的话),如果对象已经存在,则在 vtkSmartPointer deletes/stops 上调用 new。但是,这不会发生在 vtkRenderWindowInteractor 上。
解决方案如下。在缩略图之间切换时,我必须检查交互器是否存在,如果是 运行,我就调用
this->_mainInteractor->TerminateApp();
停止隐藏的 Qthread。
我有一个用于浏览和查看图像的 QMainWindow。这些图像是使用我编写的包装器读取的特殊医学图像。
GUI 左侧有一个 QListview,它显示缩略图列表。当用户 select 是其中之一时,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();
}
我的关闭事件如下所示:
void GUIClassName::closeEvent(QCloseEvent* event)
{
// mainInteractor is a vtkSmartPointer<vtkRenderWindowInteractor>
if (this->_mainInteractor != NULL)
this->_mainInteractor->TerminateApp();
event->accept();
}
问题是当我关闭 QMainWindow 时,应用程序没有终止。也就是说,命令提示符保持打开状态,按任意键继续 不会出现。如果我按 Ctrl+break,则应用程序退出(显然)但我收到以下消息:
QObject::~QObject: Timers cannot be stopped from another thread
我注意到,如果我只 select 一个缩略图并将其显示在 QVTKWidget 中,程序就会正常终止。但是当我 select 一个缩略图显示它然后 select 另一个缩略图时,当我关闭 window.
时程序不会终止我想知道是否有人可以告诉我我在这里做错了什么。我很乐意 copy/paste 更多代码,但目前我不确定哪些部分是相关的。
我已经阅读了以下内容,希望得到答案,但到目前为止我一直无法解决这个问题:
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
谢谢
您是否停止了所有线程? 我不熟悉 VTK,但看起来有人 运行 线程中的一些代码并没有正确停止它们。
RazrFalcon 给了我很好的提示。我还不是 Qt 专家,所以我一直在寻找在所有错误位置执行的 Qthread。
答案就在 vtkRenderWindowInteractor class 中。对于大多数 vtkObjects(如果我没记错的话),如果对象已经存在,则在 vtkSmartPointer deletes/stops 上调用 new。但是,这不会发生在 vtkRenderWindowInteractor 上。
解决方案如下。在缩略图之间切换时,我必须检查交互器是否存在,如果是 运行,我就调用
this->_mainInteractor->TerminateApp();
停止隐藏的 Qthread。