例如,我正在寻找一种在多个QML文件之间共享只读值的简单方法;可以说我有一个标签元素:
Label {
id: titleLabel
text: listView.currentItem ? listView.currentItem.text : "IDEAL Networks"
font.pixelSize: 20
elide: Label.ElideRight
horizontalAlignment: Qt.AlignLeft
verticalAlignment: Qt.AlignVCenter
Layout.fillWidth: true
color: red;
padding: {
left: 14
}
}
color
和padding
值需要在其他QML文件和同一文件的其他区域中使用。
不是在多个位置重新键入red
和14,而是我可以创建一个包含这些值的共享库,而不是使其在以后的全局更新中更容易?
*更新*
我已按照此处的说明进行:http://doc.qt.io/qt-5/qtqml-modules-qmldir.html
但是,当我导入自定义CustomStyles 1.0
模块时,出现错误-未安装模块“ CustomStyles”。
//Style.qml with custom singleton type definition
pragma Singleton
import QtQuick 2.0
QtObject {
property int textSize: 20
property color textColor: "green"
}
// qmldir declaring the singleton type
module CustomStyles
singleton Style 1.0 Style.qml
// singleton type in use
import QtQuick 2.0
import CustomStyles 1.0
Text {
font.pixelSize: Style.textSize
color: Style.textColor
text: "Hello World"
}
解决方案是使用单例,在这种情况下,您必须正确导入它,并假设.qml位于同一qrc中,您只需执行以下操作:
。qrc
<RCC>
<qresource prefix="/">
<file>main.qml</file>
[...]
<file>style/qmldir</file>
<file>style/style.qml</file>
</qresource>
</RCC>
Style.qml
pragma Singleton
import QtQuick 2.0
QtObject {
readonly property int padding: 20
readonly property color textColor: "green"
}
qmldir
singleton Style 1.0 Style.qml
main.qml
import QtQuick 2.0
import "style"
Text {
font.pixelSize: Style.textSize
color: Style.textColor
text: "Hello World"
}
在下面的link中有一个示例
如果您的对象树不太深,可以简单地在main.qml
的根对象中声明属性,这要归功于动态作用域,这使得它们可以从所有qml文件中解析,只要您注意不要用相同名称的本地属性遮盖它们。
如果您的树很深,使用单例会更有效,这将减少查找时间。
您还可以选择一个更接近的树节点,它不必是根元素,它必须足够深,以便所有需要访问它的对象都嵌套在其中,并且必须声明属性在特定qml文件的根元素中,以获得动态范围。