QT QML资源文件修改后不重新编译

标签 qt build resources qml qmake

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

资源 += qml.qrc

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

List of source files

如您所见,当其他文件位于子文件夹中时,一些 QML 文件位于 qml.qrc 的 ROOT 路径中,例如“qrc:/元素/”。

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

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

/**************************************************************************** ** Resource object code ** ** Created by: The Resource Compiler for Qt version 5.9.1 ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/

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”命令创建脚本文件(对我来说,它是 .sh 文件,因为我在 MAS 操作系统上工作,对于 Windows,它将是 .bat 文件)到 qml.qrc 文件。就我而言,它包含 2 行:

#!/bin/sh

Touch qml.qrc



2) 添加自定义构建步骤(Projects->Build Settings->Build Steps->Add Custom Process Step)。选择您创建的 .sh 文件,在构建位置时选择工作目录。使这个自定义步骤成为第一个执行的步骤(在 qmake 和 Make 之前)

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

解决问题的方法似乎很粗糙,但至少您不必进行清理,重建等..

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

关于QT QML资源文件修改后不重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47828015/

相关文章:

android - android项目中包含JAR会影响apk的大小吗

xcode - 帮助确定为什么 XCode "Failed to upload MyApp.app"到我的 iPad

c# - 在 resourceDictionary 中添加字体系列

C++ 使用模板成员函数继承类

qt - 如何捕获QComboBox弹出关闭事件

c++ - 如何将以下 "foreach"编写为 C++ 迭代器

qt - 使用 Qt 4.4 验证网络连接

python - Dockerfile RUN 命令返回 "No such file or directory"

maven 如何包含/src/main/resources

c++ - 这个列表是垃圾内存吗?