Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QApplication在主窗口关闭时不退出_C++_Qt_Qlistview_Qtimer - Fatal编程技术网

C++ QApplication在主窗口关闭时不退出

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

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

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();
}
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。

我不认为我显式地启动了任何线程,但我可能是隐式地创建/启动了一个线程。我将编辑我的问题以提供更多信息。我不认为我显式地启动了任何线程,但我可能会隐式地创建/启动一个线程。我将编辑我的问题以提供更多信息。