Qt 5 样式:动态加载 qml 文件

Posted

技术标签:

【中文标题】Qt 5 样式:动态加载 qml 文件【英文标题】:Qt 5 Styling: dynamically load qml files 【发布时间】: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,首字母必须小写... 【参考方案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;
    

这样,有很多好处:

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

【讨论】:

【参考方案2】:

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

Item 
    id: BackGround
    color: myDynamicStyle.item.textColorStandard

【讨论】:

以上是关于Qt 5 样式:动态加载 qml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何动态加载外部CSS与JS文件

从内存而不是 URL 动态加载 QML

QML程序实现动态切换多语言(ListModel/ListElement中的文本的多语言处理)

QML程序实现动态切换多语言(ListModel/ListElement中的文本的多语言处理)

将属性注入 QML 组件

Qt中使用QML和Listview的问题