更改后,QT QML资源文件不会重新编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改后,QT QML资源文件不会重新编译相关的知识,希望对你有一定的参考价值。

我正在使用QT 5.9.1在Mac OS上工作。我的项目是带有C ++逻辑和QML UI Layer的移动应用程序。所有QML文件都包含在qml.qrc文件中,因此在我的.pro文件中

RESOURCES + = qml.qrc

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

List of source files

正如您所看到的,当其他文件位于子文件夹中时,某些QML文件位于qml.qrc的ROOT路径中,例如“QRC:/片/”。

所以问题是我在位于qml.qrc的根目录中的文件中进行了更改 - 当我按下构建,重建或清理和构建时,它们通常会被重新编译,所以我可以看到我的更改。因此,在我的构建目录中,我看到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文件)。因此,按“Build”将创建新的qml_qrc.cpp文件,该文件将包含正确的代码,我在资源文件中进行了更改。

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

我也尝试过粘贴

更新qml

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

qml_scenes.commands = QMAKE_EXTRA_TARGETS + = qml_scenes

正如描述here,但它没有帮助

答案

好吧,经过几个小时的挖掘QTBUGS跟踪,stackoverflow和其他论坛,我找到了解决方案,以某种方式让我满意..

1)使用“touch”命令创建脚本文件(对我而言,我在.OS文件中使用.OS文件,对于Windows,它将是.bat文件),对qml.qrc文件。在我的情况下它包含2行:

#!/ bin / sh的

触摸qml.qrc

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

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

它似乎是解决问题的非常粗糙的方法,但至少你不需要清理,重建等等。

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

另一答案

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

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实用程序将在每次构建目标时扫描先前的规则。

以上是关于更改后,QT QML资源文件不会重新编译的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

更改后,Snowpack 开发服务器不会重新编译 node_modules 中的文件

如何从 QT 项目中正确删除 QML 文件

升级到qt5.12.0碰到资源文件编译的错误

Qml 图像不会在源更改和信号接收时刷新

是否可以为 android 编译 Qt+QML+OpenCV 应用程序