【问题标题】:QT QML resource files do not recompile after changesQT QML 资源文件在更改后不会重新编译
【发布时间】:2017-12-15 07:56:19
【问题描述】:

我在 Mac OS 上使用 QT 5.9.1。我的项目是具有 C++ 逻辑和 QML UI 层的移动应用程序。所有 QML 文件都包含在 qml.qrc 文件中,所以在我的 .pro 文件中有

资源 += qml.qrc

在qml.qrc里面有一个我在Project中使用的所有资源文件的列表,比如图片、图标和QML文件,在QT Creator中显示OK:

你可以看到一些 QML 文件位于 qml.qrc 的 ROOT 路径中,而其他文件位于子文件夹中,例如“qrc:/Elements/”。

所以问题是,当我对位于 qml.qrc 根目录中的文件进行更改时,它们通常会在我按下 build、rebuild 或 clean and build 时重新编译,因此我可以看到我的更改。结果,在我的构建目录中,我看到 qml_qrc.cpp(据我所知,该文件包含我的资源文件的 cpp 表示并用于编译它们)文件已刷新,我的更改已应用并且一切正常。

这里只是这个文件的一部分,它以 MainPage.qml 资源文件的 cpp 十六进制表示开始。

/**************************************************** ****************************** ** 资源对象代码 ** ** 创建者:Qt 版本 5.9.1 的资源编译器 ** ** 警告!在此文件中所做的所有更改都将丢失! ****************************************************** ******************************/

static const unsigned char qt_resource_data[] = { // /Users/admin/QtProjects/LazuritApp-temp/MainPage.qml
0x0,0x0,0x7,0xd1, 0x0,
0x0,0x1e,0xbb,0x78,0x9c,0xd5,0x19,0x5d,0x6f,0xdc,0x36,0xf2,0x7d,0x7f,0x5,0x6f, 0xb,0x14,0xbb,0x69,0xa2,0xf5,0xae,0xed,0xa4,0xde,0xa0,0x77,0xf0,0xba,0x49,0x63, 0x20,0x45,0xda,0xda,0x68,0x1e,0xe,0x45,0xc1,0x95,0xa8,0x15,0x2f,0x5a,0x51,0xa5, 0x24,0xdb,0x5b,0xc3,0x40,0xda,0x2,0xed,0x1,0x79,0x28,0x70,0x68,0x71,0xcf,0xf7, 0xf,0xdc,0xbb,0x6b,0x1b,0x34,0x4d,0xfa,0x17,0xb4,0xff,0xa8,0x43,0x52,0x5f,0x94,

.......

但是如果我更改位于子文件夹中的那些资源文件,qml_qrc.cpp 文件不会刷新,因此我的资源文件不会重建,即使我尝试清理,然后重建。即使我手动“运行 qmake”然后重建。在这种情况下唯一有帮助的 - 手动删除构建文件夹(或者更准确地说,您可以删除 qml_qrc.cpp 文件)。因此,然后按“构建”将创建新的 qml_qrc.cpp 文件,该文件将包含正确的代码,以及我在资源文件中所做的更改。

谁能帮助我或解释为什么会发生这种情况以及在这种情况下我该怎么办?手动删除和重建很烦人,但是将所有资源文件放在项目的根路径中也不是一个好的决定...

我也尝试过粘贴

更新 qml

qml_scenes.depends = $$PWD/QML Files/OrdersPage.qml

qml_scenes.commands = QMAKE_EXTRA_TARGETS += qml_scenes

here 所述,但没有帮助

【问题讨论】:

标签: qt build resources qml qmake


【解决方案1】:

好的,经过数小时的 QTBUGS 跟踪、stackoverflow 和其他论坛的挖掘后,我找到了解决方案,这让我很满意..

1) 使用 qml.qrc 文件的“touch”命令创建脚本文件(对我来说,它是 .sh 文件,因为我在 MAS OS 上工作,对于 Windows,它将是 .bat 文件)。就我而言,它包含 2 行:

#!/bin/sh

触摸qml.qrc

2) 添加自定义构建步骤(项目->构建设置->构建步骤->添加自定义流程步骤)。选择您创建的 .sh 文件,在构建时选择工作目录。使这个自定义步骤成为第一个执行的步骤(在 qmake 和 Make 之前)

3)因此,现在每次构建项目时都会编译 qml 资源文件中的更改。脚本会首先接触我们的 qml.qrc 文件,它会刷新它的修改日期,这样 qml.qrc(因此,我们的 qml 资源也是)将被添加到 makefile 依赖项中。

这似乎是解决问题的相当粗略的方法,但至少你不必清理、重建等..

如果有人有更好的解决方案,请告诉我)

【讨论】:

    【解决方案2】:

    不幸的是,cmets 中提供的链接中给出的解决方案似乎不完整和/或损坏。但也可以这样做:

    update_qml.target = qml.qrc
    update_qml.commands = echo>>$${update_qml.target} # same as touch
    update_qml.depends = $$files(path/to/resource/files/*, true) # recurse into subdirs
    QMAKE_EXTRA_TARGETS += update_qml
    PRE_TARGETDEPS += $${update_qml.target}
    

    对于那些对其工作原理感兴趣的人,QMAKE_EXTRA_TARGETS 生成以下 Makefile 规则:

    qml.qrc: file1 file2 ...
            echo>>qml.qrc
    

    因此发出命令make qml.qrc 将根据需要更新qml.qrc 的时间戳。但是,为了避免每次手动输入,我们还使用了PRE_TARGETDEPS,它修复了主要的构建规则:

    $(DESTDIR_TARGET): qml.qrc $(OBJECTS) and other stuff ...
            $(LINKER) flags objects and other stuff ...
    

    所以现在make 实用程序将在每次构建目标时扫描之前的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多