退出时删除QQuickView导致Qt应用程序冻结
-
21-12-2019 - |
题
我在Qt5.3中建立了一个死锁。如何正确修复?没有丑陋的修复(不删除qquickview*)
我有一个单例,指针指向 QQuickView
.当我需要关闭我的应用程序,我做一个电话 QGuiApplication::quit()
并尝试释放 QQuickView *
在singlenot的析构函数中。结果-应用程序冻结。
样本:
测试。qml,qml
import QtQuick 2.1
Rectangle
{
id: root;
color: "black";
signal quit();
Component.onDestruction: quit();
}
主要。cpp
#include <QGuiApplication>
#include <QQuickView>
#include <QQuickItem>
#include <QPointer>
struct Singleton
{
QPointer< QQuickView > w;
static Singleton inst;
int run( int argc, char *argv[] )
{
QGuiApplication a( argc, argv );
w = new QQuickView();
QObject::connect( w, &QQuickView::statusChanged, [=]()
{
QObject::connect( w->rootObject(), SIGNAL( quit() ), qApp, SLOT( quit() ) );
} );
w->setSource( QUrl( "qrc:/test.qml" ) );
w->setResizeMode( QQuickView::SizeRootObjectToView );
w->show();
a.exec();
return 0;
}
~Singleton()
{
delete w; // Comment this to fix bug
}
};
Singleton Singleton::inst;
int main(int argc, char *argv[] )
{
Singleton::inst.run( argc, argv );
return 0;
}
附:C++0x用于简化代码。在C++03编译器上的结果相同。
解决方案
这是一个 臭虫 在Qt中。修正自5.4版本。
不隶属于 StackOverflow