c – Qt 5样式:动态加载qml文件
作者:互联网
我目前正在尝试以不同的风格扩展我们的应用程序.
对于每种样式,我都有一个单独的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
}
}
不幸的是,这种方法不起作用.有没有其他/更好的方式来完成样式?
谢谢,迈克尔
解决方法:
使用Loader中加载的东西是非常类型的,我宁愿:
首先,为我的所有样式创建一个共同的祖先组件,例如:
// 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;
}
}
这样,有很多好处:
>您的代码不使用字符串来识别组件,因此更容易找到并避免错误;
>您不能影响不继承样式基类的项目,因此您不会遇到“未定义属性”错误,也不需要使用ducktyping来确定样式对象中的哪些信息;
>你没有装载机,所以你不必在装载机内外之间遭受令人讨厌的“上下文隔离”;
>所有组件都将在运行时预加载,在实例化时获得速度,并允许您从一开始就查看样式中是否存在语法错误,而不是仅在更改当前样式时才能看到它;
>最后但并非最不重要的是,属性自动完成将在QtCreator中工作,因为IDE将知道实际类型!
标签:c,qt,qml,styling 来源: https://codeday.me/bug/20190830/1770946.html