QML 工具是发展最快的领域之一,自 Qt 5.15 以来添加了大量新功能。在这里,我们将展示静态分析和格式化 QML 领域的进展和未来计划。
【Qt开发主流库:Qtitan组件集】
qmlint
qmlint 自从在 Qt 5.4 中引入以来已经发展了很多。它最初是一个简单的语法检查器。从那时起,它获得了警告不合格访问、“with”语句和信号注入以及其他各种违反最佳实践的能力。除了性能大幅提升之外,这里仅介绍 qmllint 中的一些新功能:
CMake qmlint 目标
在 Qt 6.2 中,如果您使用新的 QML 模块 CMake API,您将始终拥有${TARGETNAME}_qmllint模块的目标。这意味着您可以调用 qmllint 而不必担心导入路径或 linting 所有文件,因为这一切都将由目标自动处理。
在接下来的几周内,将在一系列博客文章中提供有关 QML 模块 API 的更多详细信息。
弃用警告
您现在可以将组件和属性标记为已弃用,这在 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警告类别的完整列表,请参阅 的输出。
通过设置文件配置 qmlint
除了能够通过命令行提供选项之外,qmlint 现在还可以使用设置文件进行配置。这些工作类似于其他 linter 配置文件。
这对于使您的项目准备好在 CI 中使用特别有用。
通过评论禁用警告
有时您可能无法立即修复警告,但会发现它在其他地方很有用。因此,我们允许您逐行禁用警告:
import QtQuick Item { width: 50 // This is an unqualified access height: appWindow.height // qmllint disable unqualified // ... }
持续集成和预提交挂钩
qmlint 也可以传递--json选项,该选项将使工具以机器可读的格式输出其警告,这对于集成到 CI 和预提交挂钩非常有用。例如,这里有一个应用程序,其中 qmlint 的输出用于在 GitHub 上生成自动代码审查:
未来的计划
即使现在关于 qmllint 的工作仍在进行中,而且 qmllint 将在 Qt 6.3 中大大改进类型检查和更多警告类别。我们还计划使 qmlint 更具可扩展性,以便用户能够根据其项目的特定需求生成自己的警告。
我们使用 QML 来创建漂亮的 GUI,QML 可以用漂亮简洁的方式表达我们想要的东西。IDE/编辑器(例如 Qt Creator)可以帮助我们保持所有代码缩进,以便阅读和查看。有时虽然人们只想从命令行重新格式化它,并获得一个格式良好且可读的 QML 文件。
qmlformat就是为了那个。它重新格式化您的文件,正确缩进它们,并重新格式化 javascript 表达式以使它们漂亮:)。虽然我们在自己的文件上广泛测试了该工具,但我们知道可能会发生错误。作为额外的预防措施,qmlformat 验证重新格式化输出的语义结构是否与源文件的语义结构匹配。
这意味着不能重新格式化有小错误的文件。这并不总是人们想要的:也许你想要让它成形以实际修复它。因此,如果可以解析文件,-f/--force命令行选项将禁用所有检查,并重新格式化文件。
默认情况下qmlformat,QML 对象属性会完全按照您编写它们的顺序保留。传递-n/--normalize的对象属性根据我们的编码约定中规定的规则重新排序。此选项对于将文件保持为标准化格式以及在比较文件时特别有用。
qmlformat 内部使用 qmldom,QML 作为树的内部表示,包含导入、qml 对象、属性定义和绑定。这种表示可以被编辑,每个元素都可以被唯一标识,并且可以以线程安全的方式更新。QML Design Studio 将在内部使用它来编辑 qml 文件,而无需处理更繁琐的 AST。它也是我们正在研究的语言服务器协议实现的基础,使所有新的工具改进在您选择的 IDE 中可用。
冒险家已经可以使用以下命令可视化这个内部结构,目前我们不提供任何稳定性保证:
qmldom --dump
这将返回 QML 文件中包含的主要内容的 json 描述,包括诸如弃用之类的注释。
====================================================
Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入