QQmlApplicationEngine :: loadData()在DEBUG上有效,但在RELEASE上失败

时间:2019-08-23 13:49:52

标签: windows qt qqmlapplicationengine

(Qt 5.12.2(mingw 7.3 32位)Windows 8 64位)

下一个代码在DEBUG上有效,但在RELEASE模式下失败:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDir>
#include <QFile>
#include <QResource>
#include <QByteArray>
#include <iostream>

void exploreQrcDir( const QString& path )
{
    QDir qrcDir( ":/layouts" );
    std::cout << ":/layouts : " << std::endl;
    for ( const QString& item : qrcDir.entryList())
    {
        std::cout << item.toStdString() << std::endl;
    }

    for ( const QFileInfo& item : qrcDir.entryInfoList())
    {
        std::cout << item.absoluteFilePath().toStdString() << ";" << item.isReadable() << std::endl;
    }
}

QByteArray resourceData( const QString& path )
{
    QResource qmlFile( path );

    std::cout << "Resource is valid = " << qmlFile.isValid()
              << " , is compressed = " << qmlFile.isCompressed()
              << " , size = " << qmlFile.size() << std::endl;

    QByteArray data = (const char*)( qmlFile.data() );
    std::cout << "Resource data = " << qmlFile.data() << std::endl;
    std::cout << "ByteArray = " << data.toStdString() << std::endl;

    return data;
}

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);

    exploreQrcDir( ":/layouts" );

    const QString qmlDataSource( "qrc:/layouts/layouts.qml" );
    QQmlApplicationEngine engine;

    engine.loadData( resourceData( ":/layouts/layouts.qml" ) ); //     debug version - ok
                                                                // release version - qml window not open

//    engine.load( qmlDataSource );  // ok
//    engine.load( QUrl( qmlDataSource ) ); // ok

    return app.exec();
}

在调试模式下都可以。 在“释放”模式下-任务管理器任务列表中没有错误,没有应用程序窗口和应用程序进程。

在发布模式下,我可以从应用程序资源中加载QML文件吗?

1 个答案:

答案 0 :(得分:1)

由于自{t3.11起默认启用了Qt Quick Compiler功能,QRC中声明的QML文件在发布模式下被编译为二进制代码,而纯文本QML文件被省略。

要将这种行为作为调试版本恢复,您可以将运行时读取QML文本的QML文件组织为QRC文件:

QTQUICK_COMPILER_SKIPPED_RESOURCES += bundle_only.qrc

或者只是禁用预编译功能:

CONFIG -= qtquickcompiler