【问题标题】:QQmlApplicationEngine::loadData() works on DEBUG, but fails on RELEASEQQmlApplicationEngine::loadData() 在 DEBUG 上工作,但在 RELEASE 上失败
【发布时间】:2019-12-28 20:43:46
【问题描述】:

(Qt 5.12.2(mingw 7.3 32-bit) Windows 8 64-bit)

下一个代码在 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();
}

在调试模式下一切正常。 在 RLEASE 模式下 - 任务管理器任务列表中没有错误、没有应用程序窗口和应用程序进程。

我可以在发布模式下从应用资源加载什么 QML 文件?

【问题讨论】:

    标签: windows qt qqmlapplicationengine


    【解决方案1】:

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

    要将此行为恢复为调试版本,您可以将在运行时读取 QML 文本的 QML 文件组织到 QRC 文件中:

    QTQUICK_COMPILER_SKIPPED_RESOURCES += bundle_only.qrc
    

    或者干脆禁用预编译功能:

    CONFIG -= qtquickcompiler
    

    【讨论】:

    • 是的,我也有这个问题,更改了构建设置 -> 启用 Qt 快速编译器(复选框)但在 qt 5.12.4 之后我没有遇到这个问题
    • @MahdiKhalili 很高兴听到 Qt 5.12.4 已修复它。另请注意,复选框选项取决于 Qt Creator 的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多