何时更改QML文件无效?

3

我在过去的一周里遇到了第二次问题,看起来是随机发生的。我在QML文件中改变内容,保存它,运行程序,却发现我的修改没有生效。我重新运行程序,但仍然没有生效。

第一次发生这种情况时,经过一些git处理后(按照这个顺序:git stash save,回滚到旧版本,返回最新版本,git stash pop),它就自动解决了。第二次没有这么做,而是通过Qt Creator菜单中的qmake命令解决了它。

问题可能的原因是什么?

我使用的是Qt Creator 4.1.0。


1
Qt在我使用它的这近7年中一直存在这个问题,甚至在QML出现之前,有时你必须清理并重新构建所有内容才能反映更改。不知道还需要多少年才能解决这个问题... - dtech
你是从资源中加载QML文件吗?如果是,你是否已经重新构建了它们? 一般来说,在开发过程中我会直接使用文件访问,因为这样甚至可以在应用程序运行时进行重新加载。 - Kevin Krammer
@KevinKrammer:是的,从资源中加载。当有更改时,“运行”命令通常会自动重建我的项目,因此我没有手动重建,而是假设Creator会为我完成。 - Stefan Monov
通常情况下,或者说涉及到的构建系统会这样做,例如make/nmake/jom/ninja。QML文件是否列在资源文件中,还是使用某种文件模式? - Kevin Krammer
@KevinKrammer:qrc文件目前列出了我所有的QML文件。不过,我不知道问题发生时是否仍然如此。 - Stefan Monov
我只在文件未被构建系统单独识别时遇到过这个问题。无论如何,我建议在开发阶段加载主文件(以及所有相关文件)从文件中加载QML内容进行更改。这样做会更快,不需要重新构建,甚至可以在不重启的情况下重新加载等。 - Kevin Krammer
2个回答

3

Stephan,我看到这种情况发生过,并且根据之前所读的,这是一个已知的错误。更多信息可以在以下链接中找到:

https://bugreports.qt.io/browse/QTCREATORBUG-1627

问题在于,似乎qtcreator无法检测到qlm / qrc文件的更改,因此由于未运行qmake,makefile未被更新。

看起来他们不打算解决这个bug,已经存在多年了。 qtcreator中的解决方法是手动运行qmake,然后重新构建。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - dtech
我同意,但这种情况非常令人恼火,好像对于 UI 开发来说是不可预测的问题。因此,我将尝试编制一个发生这种情况的案例清单,并分享回来 : ),即使需要手动操作,我们也可以知道所有需要运行 qmake 的情况 :) - Kanekotic
qmake通常不需要运行,除非项目设置发生了变化。根据构建系统(例如make),生成的文件应该具有所有必要的更新规则,并且构建工具应该检测到更改并运行所需的构建链。因此,这在一定程度上取决于使用哪个工具进行构建以及它如何检测更改。 - Kevin Krammer
我同意@KevinKrammer的观点,我们需要明确这实际上是一个QtCreator的bug(这是qt应用程序的主要开发工具),而不是一般的Qt。 QtCreator通常定义了构建运行qmake和make两个步骤,问题在于两者并不总是都运行,通常只有make被运行,除非您对.pro进行更改(这将导致运行qmake步骤)。问题在于QtCreator(根据我的经验)往往无法检测到应该需要运行qmake的qrc上的某些修改(我需要进一步调查和尝试以确定具体情况)。 - Kanekotic
不,QtCreator不应该需要手动重新运行qmake,生成的Makefile应该有规则来执行这个操作。就像它对.pro文件的更改一样。毕竟,像make这样的构建工具的主要工作之一就是知道要再次运行哪些命令。 如果出现问题,更可能是qmake没有生成正确的make规则。 - Kevin Krammer
但是生成有效的makefile是qmake的责任。运行qmake将更改makefile,如果需要额外的依赖项才能正确构建对qrc文件的更改。所有这些都按照应有的方式正常工作。 问题本身是Qt Creator在特定情况下修改qrc文件时没有像应该一样运行qmake来修改makefile。如果您添加了一些需要传播到makefile的依赖项,那么QtCreator应该捕获它们并决定运行qmake,不是吗? - Kanekotic

2
我又碰到了这个问题,即使我在每次运行前都认真地运行qmake。
我想我这次找出了问题的原因。我的问题在于我使用了“应用程序输出”面板工具栏中的小运行按钮(实际上称为“重新运行此运行配置”)。看起来这个按钮有一个危险的属性,即在不重建的情况下运行代码。
解决方法是使用Ctrl+R,或者等价的竖直工具栏中的大运行按钮。
另一次,问题一直存在,直到我删除了myproject.pro.user文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接