C++ QApplication在主窗口关闭时不退出
我有一个qmain窗口,用于浏览和查看图像。这些图像是使用我编写的包装器读取的特殊医学图像 GUI左侧有一个QListview,其中显示了缩略图列表。当用户选择其中一个时,QVTKWidget会在右侧显示相应的图像。我使用vtkRenderWindowInteractor来处理显示的图像 我的主要观点如下:C++ QApplication在主窗口关闭时不退出,c++,qt,qlistview,qtimer,C++,Qt,Qlistview,Qtimer,我有一个qmain窗口,用于浏览和查看图像。这些图像是使用我编写的包装器读取的特殊医学图像 GUI左侧有一个QListview,其中显示了缩略图列表。当用户选择其中一个时,QVTKWidget会在右侧显示相应的图像。我使用vtkRenderWindowInteractor来处理显示的图像 我的主要观点如下: #include <QApplication> #include "GUIClassName.h" //inherits from QMainWindow int main(in
#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();
}
我的closeEvent如下所示:
#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();
}
问题是,当我关闭qmain窗口时,应用程序不会终止。也就是说,命令提示符保持打开状态,按任意键继续不会出现。如果我按Ctrl+break,那么应用程序显然会退出,但我会收到以下消息:
QObject::~QObject:无法从其他线程停止计时器
我注意到,如果我只选择一个缩略图并将其显示在QVTKWidget中,程序就会很好地终止。但当我选择一个缩略图,显示它,然后选择另一个缩略图,那么程序不会在我关闭窗口时终止
我想知道是否有人能告诉我我做错了什么。我很乐意复制/粘贴更多代码,但我不确定目前哪些部分是相关的
我已经阅读了以下内容,希望得到答案,但到目前为止,我无法解决这个问题:
谢谢您是否停止了所有线程?
我不熟悉VTK,但看起来有人在线程中运行了一些代码,但没有正确地停止它们。您是否停止了所有线程?
我不熟悉VTK,但看起来有人在线程中运行了一些代码,没有正确地停止它们。RazrFalcon给了我一个很好的提示。我还不是Qt方面的专家,所以我在寻找在所有错误位置执行的Qthread 答案就在vtkRenderWindowInteractor类中。如果我没有弄错的话,对于大多数vtkObjects,在vtkSmartPointer上调用new会删除/停止已经存在的对象。但是,vtkRenderWindowInteractor不会发生这种情况 解决办法如下。在缩略图之间切换时,我必须检查Interactior是否存在,如果它正在运行,我只需调用
this->_mainInteractor->TerminateApp();
停止隐藏的Qthread。RazrFalcon给了我一个很好的提示。我还不是Qt方面的专家,所以我在寻找在所有错误位置执行的Qthread 答案就在vtkRenderWindowInteractor类中。如果我没有弄错的话,对于大多数vtkObjects,在vtkSmartPointer上调用new会删除/停止已经存在的对象。但是,vtkRenderWindowInteractor不会发生这种情况 解决办法如下。在缩略图之间切换时,我必须检查Interactior是否存在,如果它正在运行,我只需调用
this->_mainInteractor->TerminateApp();
停止隐藏的Qthread。我不认为我显式地启动了任何线程,但我可能是隐式地创建/启动了一个线程。我将编辑我的问题以提供更多信息。我不认为我显式地启动了任何线程,但我可能会隐式地创建/启动一个线程。我将编辑我的问题以提供更多信息。