Visual studio Qt-visualstudio工具moc和qrc-don';不尊重预构建事件

Visual studio Qt-visualstudio工具moc和qrc-don';不尊重预构建事件,visual-studio,qt,qt-vs-addin,Visual Studio,Qt,Qt Vs Addin,在编译包含翻译的资源文件(QRC)之前,我想使用脚本构建翻译(使用Qt的lrelease.exe,从.ts转换为.qm)。通过这种方式,我知道它们总是被更新的,更不用说避免在存储库中包含二进制文件了 我使用Visual Studio并安装了Qt Visual Studio工具。通常,我会通过项目中的预构建步骤来完成这项工作,但它不会被执行,并且QRC文件的编译总是失败 该脚本工作正常,如果作为生成后事件放置或从命令行调用,则会成功调用该脚本 @echo off pushd "%1" for

在编译包含翻译的资源文件(QRC)之前,我想使用脚本构建翻译(使用Qt的
lrelease.exe
,从.ts转换为.qm)。通过这种方式,我知道它们总是被更新的,更不用说避免在存储库中包含二进制文件了

我使用Visual Studio并安装了Qt Visual Studio工具。通常,我会通过项目中的预构建步骤来完成这项工作,但它不会被执行,并且QRC文件的编译总是失败

该脚本工作正常,如果作为生成后事件放置或从命令行调用,则会成功调用该脚本

@echo off

pushd "%1"
for %%F in (*.ts) do (
    c:\Qt\qt_5_12_3\v141\Win32\bin\lrelease -compress %%F -qm %%~nF.qm
)
popd

exit /b 0

我做错了什么?

碰巧我使用的是Qt VS Tools的新Qt/MSBuild模式。在内部,它在MSBuild工作流中生成几个隐藏目标,这些目标在预生成事件之前执行

解决方案是使用自定义构建步骤,并带有一些特定设置:

  • QtRcc目标(实际编译资源文件的目标)之前执行
  • Qt-VS工具解析QRC文件以检查资源是否已被修改,因此可以跳过编译它们。有必要将.qm翻译文件添加为自定义生成步骤的输出
  • 类似地,为了确保始终编译翻译,请将自定义生成步骤的依赖项设置为.ts源文件

@echo off

pushd "%1"
for %%F in (*.ts) do (
    c:\Qt\qt_5_12_3\v141\Win32\bin\lrelease -compress %%F -qm %%~nF.qm
)
popd

exit /b 0