尝试通过插入子样式项来设置 Qt QML 项的样式

Posted

技术标签:

【中文标题】尝试通过插入子样式项来设置 Qt QML 项的样式【英文标题】:Trying to style Qt QML items by inserting child styling item 【发布时间】:2019-08-06 22:05:07 【问题描述】:

我正在尝试不同的方法来设置 QT 的应用 QML 项目的样式。我的目标是:

限制主文件中的代码量(隐藏样式文件中的所有样式内容,与样式单例方法不同) 不必定义我要使用的每一种类型的项目(与自定义组件方法不同) 可能能够在单个项目中混合和匹配不同的预定义样式。

也许有一个明确的策略来获得这个,我只是还没有读到它。也许它无论如何都没有任何意义:-)

我一直在玩定义不同组件的想法,一个用于我想要定义的每种样式类型。这个想法是: - 定义一个要修改其父级的组件 - 在我想采用该特定样式的位置插入该组件

第一种方法依赖于一些 javascript 调用:

MyStyle.qml:

Item 
  Component.onCompleted: 
    parent.color = "lightblue"
    parent.radius = 5
    parent.border.width = 3
    parent.border.color = "black"
  

在我的主要代码中:

    Rectangle 
      id: testRectangle
      anchors.fill: parent
      MyStyle 
    

这给了我想要的结果,但感觉不对:

我希望一劳永逸地静态应用样式 如果我开始在所有地方使用它,我会不会在创建对象时看到伪影并减慢我的界面速度?

所以我也试过了:

MyRectangleStyle.qml:

Item 
  property Rectangle styleTarget
  styleTarget.color: "lightblue"
  styleTarget.radius: 5
  styleTarget.border.width: 3
  styleTarget.border.color: "black"

在我的主要代码中:

    Rectangle 
      id: testRectangle
      anchors.fill: parent
      MyStyle styleTarget: testRectangle
    

但是:

好吧,它不起作用 :-)(虽然没有警告,qml 根本无法加载) 我又回到了必须定义我要使用的每一种类型的项目。

那么,有没有更好的方法来实现我在这里尝试做的事情?谢谢!

【问题讨论】:

我认为这样做会有些困难。例如,如何将事物设置为突出显示的按钮? 【参考方案1】:

您的第二种方法不起作用,因为您的组件将属性设置为在创建组件时不一定存在的项目,而是在 styleTarget 更改时设置属性。另一方面,MyStyle没有必要是Item,因为它没有显示,而是使用QtObject,最后将您的方法更改property Item styleTarget推广到property Rectangle styleTarget

QtObject 
    property Item styleTarget
    onStyleTargetChanged: 
        styleTarget.color = "lightblue"
        styleTarget.radius = 5
        styleTarget.border.width = 3
        styleTarget.border.color= "black"
    

【讨论】:

感谢您的回答,它确实有效。但是这第二种方法比第一种更好吗?当不同的项目被创建并首次显示时,我是否会看到工件(我会看到与受影响的属性有关的“故障”),还是甚至在目标项目首次显示之前发生这种情况?您是否知道其他更适合设置 QML 应用程序样式的方法?谢谢。 @Will59 我不认为它会产生问题,所有项目的绘画都是同时完成的,而且它已经过优化,所以应该没有问题。或者您是否可以在瞬间看到数百万个项目?如果您没有它,那么您想要的优化称为微优化,它根本没有帮助,相反它是浪费时间。阅读softwareengineering.stackexchange.com/questions/99445/… @Will59 与第一种方法不同的是,你的 Style 可以应用到另一个 Item 上(显然会移除初始 Item 的样式)。

以上是关于尝试通过插入子样式项来设置 Qt QML 项的样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中使用助记符字符串设置 MenuBarItem 的样式

样式化 Qml 桌面组件

QML ProgressBar 无效的属性名称“样式”

qt quick QML 应用程序的自定义样式页面(如 HTML 和 CSS)

如何更改 Qt QML Drawer 的阴影颜色(不声明自定义样式)?

Qt:使用样式表设置背景图像不适用于资源