我在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版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top