我正在尝试使用' font.family'等嵌套属性。或者' anchors.fill',但是我无法以正常方式初始化它们,因为它打印了“无法分配给不存在的属性”#。相反,我被迫使用Component.onCompleted方法。怎么了?
MyButtonStyling.qml:
import QtQml 2.1
QtObject
{
property QtObject background: QtObject
{
property color pressed: "#CCCCCC"
property color enabled: "#666666"
property color disabled: "#555555"
}
}
main.qml:
import QtQuick 2.0
Item
{
width: 400
height: 300
MyButton
{
text: "TEST"
styling: MyButtonStyling
{
//background.enabled: "#1B2E0A" //Cannot assign to non-existent property "enabled"
Component.onCompleted:
{
background.enabled = "#1B2E0A" //Works
}
}
}
}
MyButton.qml:
import QtQuick 2.0
import QtQuick.Controls 1.0
import QtQuick.Controls.Styles 1.0
Button
{
property QtObject styling: MyButtonStyling {}
implicitWidth: 80
implicitHeight: 80
style: ButtonStyle
{
background: Item
{
Rectangle
{
anchors.fill: parent
color: control.pressed ? styling.background.pressed : control.enabled ? styling.background.enabled : styling.background.disabled
}
}
}
}
答案 0 :(得分:12)
尝试用QML文件替换嵌套的QtObject
。例如,我将其替换为BackgroundTheme.qml
。这样,属性(可以正确地称为"分组属性")在绑定中正常工作,没有任何错误。
BackgroundTheme.qml
import QtQuick 2.0
QtObject {
property color pressed: "#CCCCCC"
property color enabled: "#666666"
property color disabled: "#555555"
}
MyButtonStyling.qml
import QtQuick 2.0
QtObject {
property BackgroundTheme background: BackgroundTheme {}
}
答案 1 :(得分:1)
要添加到问题的什么地方部分。
您的方法无效,因为左侧的表达式在QML中是静态键入的。
我遇到了同样的问题,发现this comment by Matthew Vogt出现在QT错误报告中:
此行为目前是正确的。
QML是为左侧表达式静态类型化的,因此无法在初始化时解析属性的静态类型中不存在的动态属性。
此问题的解决方法是将要初始化的类型的声明移到其自己的文件中,以便可以将其声明为具有正确静态类型的属性。
previous comment就是一个很好的例子:
此错误与别名的使用没有特别关系-它是由在不同单元中进行编译期间的属性查找导致的。 一个简单的例子:
Base.qml
import QtQuick 2.0
Item {
property QtObject foo: Image {
property color fg: "red"
}
property color bar: foo.fg
}
main.qml
import QtQuick 2.0
Base {
foo.fg: "green"
}
此处,“ foo”具有静态类型“ QtObject”和动态类型“ QQuickImage_QML_1”。在Base.qml中的“ bar”初始化中,对“ fg”的查找成功,但在main.qml中的查找失败。
答案 2 :(得分:1)
这可能不是正确的方法。但这有效
MyButtonStyling.qml
import QtQml 2.1
QtObject
{
property alias background: _obj_background
QtObject
{
id: _obj_background
property color pressed: "#CCCCCC"
property color enabled: "#666666"
property color disabled: "#555555"
}
}
现在可以在main.qml中使用background.enabled: "#1B2E0A"
。