QML 高效开发之加载方式

2024/01/04 Qt

背景

日常使用 QML开发软件过程中,默认使用 qrc 存在开发效率慢问题,比如每次修改界面内容后需要先构建才能看到实际效果,尤其在频繁调试界面样式时显得更繁琐

原理

Qt 中的资源分为两类,编译型外部二进制资源

编译型资源每次更改后都需要构建才能生效。QML 作为一种特殊的资源文件,每次改动后qrc无法感知是否修改,构建后才会更新对应的数据内容(如图所示)

rcc

其它资源文件比如图片等,原理类似

比如你在程序中使用了某张图片,需求变化需要更新某张图片,你直接拷贝替换后直接运行程序,发现未生效,找了半天问题,最后构建后发现神奇的好了

解决方案

知道了问题原因,那就可以对症下药。简而言之,跳过 编译型 qrc方式,直接从本地路经加载 QML 资源,比如

  • 开发阶段:
    qmlRes = file:///D:/code/src/KQML/App.qm
    QQmlApplicationEngine engine;
    engine.load(qmlRes);
    
  • 正式发布阶段
    qmlRes = "C:/kchat/cfg/KSkinRes.rcc"
    QResource::registerResource(qmlRes);
    engine.load(qmlRes);
    

上面的 KSkinRes.rcc 文件是通过 Qtrcc 工具编译生成的二进制文件

完整示例解决方案

C++ 代码处理

  • 增加加载方式配置文件 用来判断判断程序资源走本地模式还是外部二进制模式,配置文件格式根据自己项目而定,XMLJSONini 均可,下面以常用的 ini为例

本地开发时修改成本地模式

[General]
skinRes=file:///D:/CloundCode/KWeChatQml/src/KQML/App.qml

项目发布时,走 qrc 模式

[General]
skinRes=qrc:/KQML/App.qml
  • C++ 加载适配
      QSettings settings("./conf/app.ini", QSettings::IniFormat);
    #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
      settings.setIniCodec("UTF8");
    #endif
    
      if(settings.contains("skinRes")) {
          qmlRes = settings.value("skinRes").toString();
      }
      if(qmlRes.startsWith("file:///", Qt::CaseInsensitive))
      {
          QFileInfo fInfo(QUrl(qmlRes).toLocalFile());
          resPrefix = fInfo.absolutePath() + "/";
      }
      else {
          QString strFullResPath = QCoreApplication::applicationDirPath() + "/conf/KSkinRes.rcc";
          if (!QResource::registerResource(strFullResPath))
          {
              LOG_ERROR() << "QResource registerResource qml failed! " << strFullResPath;
              return 1;
          }
      }
    
      QQmlApplicationEngine engine;
      engine.load(qmlRes);
    
  • 资源编译
    rcc.exe -binary ./qml.qrc -o ./bin/KSkinRes.rcc
    

    其中 qml.qrc文件包含了项目中使用到的所有资源文件:图片,QML/js文件等

参考文章

https://doc.qt.io/qt-5/resources.html


作者:鹅卵石
版本:V 0.0.1
版权:本博客若无特别声明,均属于作者原创文章,欢迎大家转载分享。但是,
希望您注明来源,并留下原文地址,这是对作者最大的尊重,也是对知识的尊重。

如果您对本文有任何问题,可以在下方留言,或者Email我.

Show Disqus Comments

Search

    欢迎关注我的微信号

    一个不羁的码农

    不羁的程序员

    转载请注明出处!

    Table of Contents