Qt 6.2中的QML工具推出了哪些新功能?

本文翻译自What's new in QML Tooling in Qt 6.2? (原文发表于9月4日)
原文作者:Qt公司研发工程师Fawzi Mohamed与Maximilian Goldstein
校审:Amos Yang

在我们取得长足进展的几项领域中,QML工具是进展最快的领域之一,自Qt 5.15以来添加了众多新功能。本文罗列了目前在静态分析和格式化QML领域所取得的进展以及未来计划。

qmllint

qmllint自从Qt 5.4推出后已有重大改进。最初它只是简单的语法检查器,但自那以后增加了语法表达和信号的注入以及各种其他违反推荐用法的非限定访问警告的能力。除了性能大幅度提升外,以下仅是qmllint的一些新功能:


CMake中的target:qmllint
在Qt 6.2中,如果您使用新的QML模块CMake API,您的模块将始终包含${TARGETNAME}_qmllint target。这意味着您可以直接调用qmllint而无需担心导入路径或检查所有文件,因为这一切都将由目标自动处理。


弃用警告

您现在可以将组件和属性标记为弃用,这一功能在C++中由来已久:

import QtQuick
Text {
    @Deprecated { reason: "Use newProperty instead!" }
    property int oldProperty
    property int newProperty
    Component.onCompleted: console.log(oldProperty);  // Warning: XY.qml:8:40: Property "oldProperty" is deprecated (Reason: Use newProperty instead!)
}

这将使在公共API中进行更改交流更容易。


按类别切换警告

您现在可以按类别单独禁用警告,例如qmllint在默认情况下会提示您未使用的导入:

import QtQuick
import QtQuick3D // Info: DEM.qml:2:1: Unused import at DEM.qml:2:1
Text {
    id: textElement
    text: "Hello world!"
    anchors.centerIn: parent
}

如需要,现在可以通过传递--unused-imports disable来禁用这一提示,或是使用--unused-imports warning将提示信息转变为一条完整警告。与其他警告一样,未使用的导入警告会使qmllint返回为“1”的退出代码。这将导致使用该工具的任何CI或预提交的钩子运行失败。请通过qmllint --help输出的结果查阅完整的警告类型列表。


通过设置文件配置qmllint

除了能够通过命令行提供选项外,qmllint现在还可以使用设置文件进行配置。其设置方式与其他代码校验工具的配置文件类似。

更多详细信息请参阅此文档

这对于使您的项目准备好在CI中使用特别有用。


通过注释禁用警告

有时候您也许无法立刻修复某项警告,但发现它在其他地方仍然有用。因此,我们允许您按行禁用警告。

import QtQuick
Item {
   width: 50
   // This is an unqualified access
   height: appWindow.height // qmllint disable unqualified
   // ...
}

了解更多关于通过注释禁用警告请点击此处

持续集成(CI)和预提交钩子

qmllint也可传递--json选项使工具以机器可读的格式输出警告。这对集成到CI和预提交钩子非常有用。例如,下面这个应用利用qmllint的输出在GitHub上生成自动代码审查。

 未来计划

目前qmllint的开发工作仍在进行中,而且将在Qt 6.3中大大改进类型检查和更多警告类别。我们还计划使qmllint更具可扩展性,让用户能够根据自身项目的特定需求定制警告。


qmlformat

我们使用QML创建漂亮的可视化GUI。QML可以用美观简洁的方式表达我们想要的东西。IDE/编辑器(如Qt Creator)能帮助我们保持所有代码缩进,便于阅读和查看。不过有时人们只想在命令行中重新格式化代码,以获得一份格式良好、可读性强的QML文件。

qmlformat正是为此而生。它能重新格式化您的文件,正确缩进代码,并重新格式化javascript表达式的格式使其更加美观。虽然我们在内部文件上广泛测试了该工具,但我们知道依然有可能发生运行错误。作为额外的预防措施,qmlformat会验证重新格式化输出的语义结构与源文件的语义结构是否匹配。

这意味着不能重新格式化有小错误的文件。这不一定是大家想要的:您可能希望先整理格式再修改错误。因此只要文件可以解析,-f/--force命令行选项将禁用所有检查强制格式化文件。

默认情况下,qmlformat会尝试完全按照您编写的顺序保留QML对象的属性。传递-n/--normalize将根据我们的编码规范中的规则重新排序各对象属性。该选项对保证文件的标准化格式和比较文件特别有用。


qmldom

qmlformat内部使用了qmldom,这是一种将QML表示为对象树的形式,其中包含import、QML对象、属性定义和绑定。这种表示可被编辑,每个元素都可被唯一标识,并可以通过线程安全的方式更新。Qt Design Studio将在内部使用它来编辑QML文件,而无需处理更繁冗的 AST。这也是我们正在设计的语言服务协议(LSP)实现的基础,这些工具的新改进都包含在IDE中供您挑选。

敢于尝试的开发者已经可以使用以下命令可视化这个内部结构,目前我们不提供任何稳定性保证:

qmldom --dump <MyQmlFile>

该命令将返回QML文件中包含的主要内容的JASON格式描述,也包括注释比如弃用标识等。


总结

我们期待您使用改进后的新版qmllint和qmlformat,同时告知我们您发现的问题。如果您遇到任何问题,请通过我们的错误追踪器提交错误信息。即将到来的发布版本中包含着诸多工具,我们迫不及待地在万事俱备后与您分享它!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值