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



我在Qt 5.3中发现了死锁。如何正确固定?不修改(不删除qquickview *)

我有一个指向QQuickView的单例。当我需要关闭我的应用程序时,我调用QGuiApplication::quit()并尝试在singlenot的析构函数中释放QQuickView *。结果-应用程序冻结。

示例:

test.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;
}

注:c++ 0x用于简化代码。

这是Qt的一个错误,从5.4版开始修复。

相关内容

  • 没有找到相关文章

最新更新