【问题标题】:Qt 5 Styling: dynamically load qml filesQt 5 样式:动态加载 qml 文件
【发布时间】:2014-05-07 12:38:05
【问题描述】:

我目前正在尝试用不同的风格扩展我们的应用程序。 对于每种样式,我都有一个单独的 qml 文件,例如颜色定义。 StyleA.qml:

import QtQuick 2.0
QtObject {
    property color textColorStandard: 'black'
    ...
}

在我的 main.qml 中,我想根据软件属性加载正确的 qml 文件:

import QtQuick 2.0
Item {
    id: mainPanel
    ....

    Loader {
        id: myDynamicStyle
        source:  Property.UseThemeA? "StyleA.qml" : "StyleB.qml"
    }
    ...
    Item {
            id: BackGround
            color: myDynamicStyle.textColorStandard
    }
}

不幸的是,这种方法不起作用。有没有其他/更好的方式来完成造型?

谢谢,迈克尔

【问题讨论】:

  • 改用color: myDynamicStyle.item.textColorStandard :) 干杯!
  • 现在可以使用了,谢谢!
  • 其实下面abousket的回答是对的,所以应该可以接受:)
  • 其实QML中不能有“Background”作为ID,首字母必须小写...

标签: c++ qt qml styling


【解决方案1】:

使用加载器中加载的东西输入错误,我宁愿:

首先,为我所有的样式创建一个共同的祖先组件,例如:

// AbstractStyle.qml
import QtQuick 2.0;
QtObject {
    property color textColorStandard;
}

接下来,派生它以创建自定义样式,例如:

// StyleA.qml
import QtQuick 2.0;
AbstractStyle {
    textColorStandard: "blue";
}

// StyleB.qml
import QtQuick 2.0;
AbstractStyle {
    textColorStandard: "green";
}

然后在我的对象中使用一个必须使用样式的强类型属性,例如:

// main.qml
import QtQuick 2.0
Item {
    id: base;

    Component { id: compoStyleA; StyleA { } }
    Component { id: compoStyleB; StyleB { } }

    property AbstractStyle currentStyle : {
        var tmp = (Property.UseThemeA ? compoStyleA : compoStyleB); // choose component
        return tmp.createObject (base); // instanciate it and return it
    }

    Rectangle {
        color: currentStyle.textColorStandard;
    }
}

这样,有很多好处:

  1. 您的代码不使用字符串来识别组件,因此更容易发现和避免错误;
  2. 您不能影响不继承您的样式基类的项目,因此您不会遇到“未定义属性”错误,也不需要通过鸭式打字来确定您的样式对象中有哪些信息;
  3. 您没有 Loader,因此您不必遭受 Loader 内部和外部之间令人讨厌的“上下文隔离”;
  4. 所有组件都将在运行时预加载,在实例化时加快速度,并允许您从一开始就查看样式中是否存在语法错误,而不是仅在更改当前样式时查看;
  5. 最后但同样重要的是,属性自动完成将在 QtCreator 中工作,因为 IDE 将知道实际类型!

【讨论】:

    【解决方案2】:

    您是否尝试过使用它?加载的对象存储在loader的item属性中,不直接存储在loader中。

    Item {
        id: BackGround
        color: myDynamicStyle.item.textColorStandard
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多