退出时删除QQuickView会导致Qt应用程序冻结
我在Qt5.3中发现了一个死锁。如何正确安装?没有丑陋的修复(不删除qquickview*) 我有一个指向退出时删除QQuickView会导致Qt应用程序冻结,qt,qml,qt5,qquickview,Qt,Qml,Qt5,Qquickview,我在Qt5.3中发现了一个死锁。如何正确安装?没有丑陋的修复(不删除qquickview*) 我有一个指向QQuickView的单例。当我需要关闭我的应用程序时,我调用QGuiApplication::quit(),并尝试在singlenot的析构函数中释放QQuickView*。结果-应用程序冻结 样本: 测试.qml import QtQuick 2.1 Rectangle { id: root; color: "black"; signal quit();
QQuickView
的单例。当我需要关闭我的应用程序时,我调用QGuiApplication::quit()
,并尝试在singlenot的析构函数中释放QQuickView*
。结果-应用程序冻结
样本:
测试.qml
import QtQuick 2.1
Rectangle
{
id: root;
color: "black";
signal quit();
Component.onDestruction: quit();
}
main.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;
}
#包括
#包括
#包括
#包括
结构单体
{
QPointerw;
静态单态仪器;
int运行(int argc,char*argv[]
{
QGUI应用程序a(argc、argv);
w=新的QQuickView();
QObject::connect(w,&QQuickView::statusChanged,[=]()
{
连接(w->rootObject(),信号(quit()),qApp,插槽(quit());
} );
w->setSource(qrl(“qrc:/test.qml”);
w->setResizeMode(QQuickView::SizerootObject视图);
w->show();
a、 exec();
返回0;
}
~Singleton()
{
删除w;//对此进行注释以修复错误
}
};
单例单例::inst;
int main(int argc,char*argv[])
{
Singleton::inst.run(argc,argv);
返回0;
}
p.S.C++0x用于简化代码。在C++03编译器上得到了相同的结果。这是Qt中的一个错误。从5.4版开始修复。如果您将
删除w代码>在a.exec()之后代码>?似乎这是一个已知的问题:如果我将delete w
放在a.exec()
之后,那么一切都正常。但这似乎是MS CRT的功能(在退出main()
)时杀死应用程序。使嵌套的connect
s@定向的目标是什么?等待QML加载并创建根对象。