所有自定义 QML 组件都应该将“Item”作为其根元素吗?

Posted

技术标签:

【中文标题】所有自定义 QML 组件都应该将“Item”作为其根元素吗?【英文标题】:Should all custom QML components have "Item" as their root element? 【发布时间】:2021-03-14 14:58:32 【问题描述】:

这是一个最佳实践问题。在 QML 中,是否最好使用 Item 类型作为所有自定义 QML 组件的根元素,还是可以使用 Rectangle、ColumnLayout 或其他任何东西作为根元素?毕竟 Rectangle 和 ColumnLayout 继承自 Item 所以从某种意义上说,如果使用其中任何一个,它仍然是 Item 根元素。不使用实际的 Item QML 类型(基本类型)作为自定义组件的根元素是否有任何已知的缺点?

【问题讨论】:

【参考方案1】:

没有。您应该使用最适合您要求的任何方法。对于该组件的用户(例如 default properties、sizing behaviour 等),有一些事情需要记住,但没有任何内容表明您应该使用 Item 作为根元素。

【讨论】:

是的,实际上QML中的继承根是QtObject QML Type。将Item QML Type 用于常量存储或数据源管理等非 GUI 相关的事情是一种过度杀伤和反模式。 我知道,鉴于 QML 是如何呈现和营销的,这很奇怪,但事实是 QML 组件不必与图形用户界面。 QML 本身没有任何东西会强制组件成为可绘制的东西——只有 QtQuick 库中的特定基本类型才能做到这一点。没有技术限制应该阻止您设计 Web 服务器 QML 类型,或声明 SQL 连接属性等。 说到网络服务器,其实有一个DBus connection plugin,它正在使用 QtTest 框架进行测试——100% 纯 QML API,不涉及可绘制项。 @ratijas 是的,我已经部署了QML daemons。

以上是关于所有自定义 QML 组件都应该将“Item”作为其根元素吗?的主要内容,如果未能解决你的问题,请参考以下文章

QML::常用基础控件属性1

如何创建具有预定义状态的自定义 Quick QML 项目

Qt5 / PyQt5 : 带有 QML 前端和 Python 后端的自定义 QML 组件

qml-自定义quick模块

如何使用自定义形状创建 QML 滑块?

27.Qt Quick QML-StateTransition