(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文件吗?
答案 0 :(得分:1)
由于自{t3.11起默认启用了Qt Quick Compiler功能,QRC中声明的QML文件在发布模式下被编译为二进制代码,而纯文本QML文件被省略。
要将这种行为作为调试版本恢复,您可以将运行时读取QML文本的QML文件组织为QRC文件:
QTQUICK_COMPILER_SKIPPED_RESOURCES += bundle_only.qrc
或者只是禁用预编译功能:
CONFIG -= qtquickcompiler