Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QML中继承调色板_Qt_Qml - Fatal编程技术网

Qt 在QML中继承调色板

Qt 在QML中继承调色板,qt,qml,Qt,Qml,我想在QML中创建一个非常简单的调色板,如下所示: QtObject { property color foreground property color background property color primary property color secondary } 然后,我希望能够为组件设置调色板,并使该组件的所有(自定义)子控件自动继承调色板。要么到组件树的底部,要么直到我在其中一个子组件上设置了另一个调色板 + root (Palette A) +- child

我想在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)
这有可能吗

编辑:我目前考虑的方法是在
root
组件中创建一个
colorplate
属性,并从
子组件中引用它。只要我想覆盖当前调色板,我就可以将
颜色调色板
属性添加到
子项

当然,这是可行的,但我不认为这是一个非常干净的解决方案,因为这样我只能在有全局
colorplate
属性时使用我的组件。此外,这可能会导致以后的命名冲突。

好吧,考虑到任何根元素的属性都将通过动态作用域直接或不直接对所有嵌套元素可见,除非它们被隐藏,否则实现您想要的应该不会太难

你所需要做的就是仔细命名你的属性,这样它们就不会被遮挡。从那时起,如果你做一个
someprop:somevalue
,它将试图找到
somevalue
,并将它解析为它找到的第一个值

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

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


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

您已经做了什么?你遇到了什么问题?请注意,SO不是一个学习资源。谢谢你提醒我,我编辑了我的帖子。请发布而不是描述代码。谢谢你的建议。我现在选择使用动态范围界定方法。不过,我希望有一个更干净的解决方案,当
colorplate
未定义时不会失败。@JohannesStricker您可以通过检查它是否未定义来进行故障保护。是的,我知道。但如果我要在很多地方检查的话,这很快就会变得一团糟。也许我可以做一些类似于
属性颜色调色板_colorplate:colorplate | | colorplate{}