退出时删除QQuickView会导致Qt应用程序冻结

退出时删除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();

我在Qt5.3中发现了一个死锁。如何正确安装?没有丑陋的修复(不删除qquickview*)

我有一个指向
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加载并创建根对象。