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 文件的主要内容,如果未能解决你的问题,请参考以下文章
QML程序实现动态切换多语言(ListModel/ListElement中的文本的多语言处理)