跨多个 QML 文件共享颜色值和其他只读值
Share color values and other read-only values across multiple QML files
例如,我正在寻找一种跨多个 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 文件的根元素中声明以获得动态范围。
例如,我正在寻找一种跨多个 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 文件的根元素中声明以获得动态范围。