继承QML中的调色板

时间:2018-11-05 07:56:13

标签: qt qml

我想在QML中创建一个非常简单的调色板,如下所示:

QtObject {
  property color foreground
  property color background
  property color primary
  property color secondary
}

然后,我希望能够为组件设置调色板,并使该组件的所有(自定义)子控件自动继承调色板。要么在组件树的底部,要么直到我在其中一个子组件上设置另一个调色板为止。

+ root (Palette A)
+- child (inherit Palette A)
+-- child (inherit Palette A)
+- child (Palette B)
+-- child (inherit Palette B)

这有可能吗?

编辑:我目前正在考虑的方法是在colorPalette组件中创建一个root属性,并从child组件中引用它。每当我想覆盖当前调色板时,都可以向colorPalette添加一个child属性。 当然这是可行的,但是我认为这不是一个非常干净的解决方案,因为那样的话,我只能在有全局colorPalette属性的情况下使用组件。此外,这可能会在以后导致命名冲突。

1 个答案:

答案 0 :(得分:1)

考虑到任何根元素的属性都可以通过动态作用域直接或不可见地显示给所有嵌套元素,除非它们被阴影遮盖了,要实现所需的功能并不难。

您需要做的就是仔细命名属性,以免出现阴影。然后,如果您执行someprop: somevalue,它将尝试找到somevalue并将其解析为找到的第一个。

如果QML具有这样的接口和多重继承,那就太好了,不幸的是,它没有任何支持,甚至也没有宏支持,以避免随之而来的过多的复制粘贴和相关的维护问题。

如果您要使用嵌套方法,建议您使用Item而不是QtObject,因为后者不能真正有孩子。嵌套方法最终会导致开销,因为每次要在调色板中嵌套某些东西时,您都必须拥有一个调色板实例。

另一种解决方案是使用QtObject属性,这样您可以将其多个实例分配给单个调色板对象。但是然后,您还必须手动为每个应该提供淡化的对象实现该属性,并且每次要引用颜色时,都必须执行palette.colorValue而不是colorValue,并且调色板属性,只是一个调色板嵌套适配器。这并不是说嵌套方法会比较冗长,因为它很可能会遇到使用嵌套项目的布局问题,这也需要代码来解决。