QML:在派生 class 中使 属性 只读
QML: Make property readonly in derived class
我很确定答案是否定的,但我想我还是应该问一下。能否在派生的纯 QML 中创建 属性 readonly/constant class?
// Base.qml
Item {
property int foo: 42
}
// Derived.qml
Base {
foo: 99 // Make constant somehow!
}
我目前正在通过检测 foo
中的变化并将错误打印到控制台来解决这个问题,但这很难说是好的 API...
我有一个菜单项 class,它可以代表菜单项、子菜单、分隔符等。我需要专门化它的行为,但是 只有 在子菜单模式。我可以更改继承树,因此我为每个菜单类型都有一个 subclass,但这看起来很愚蠢,因为每个 subclass 将只包含一个 readonly
属性。但是,如果没有其他方法,我将不得不这样做。
为什么不对私有 foo 使用继承 getter/setters?
类似于:
//Base.qml
Item
{
QtObject
{
id : privateFoo
property int foo : 42
}
function getFoo() {return privateFoo.foo;}
function setFoo(newFoo) { privateFoo.foo = newFoo; }
}
//derived.qml
Base
{
function getFoo() {return 99;}
function setFoo(newFoo) { /*do nothing */ }
}
(我没有测试过这段代码)
您还可以将 foo
作为 readonly alias
转换为内部 属性 _foo
,您将仅将其用于派生 class 中的赋值:
// Base.qml
Item {
id: base
readonly property alias foo: base._foo
property int _foo: 42 // only used for assignment in subclasses
}
要在另一个组件中使用:
Item {
Base {
id: child0
}
Base {
id: child1
_foo: 99
}
Base {
id: child2
_foo: child1.foo
}
Component.onCompleted: {
console.log("child0:", child0.foo,"child1:", child1.foo, "child2:", child2.foo)
child1.foo = 5 // not allowed!
console.log("child0:", child0.foo,"child1:", child1.foo, "child2:", child2.foo)
}
}
输出:
child0: 42 child1: 99 child2: 99
TypeError: Cannot assign to read-only property "foo"
注:当然以后还是可以修改_foo
的。但是,如果您记得仅将它用于赋值,那么您将在派生的 class.
中使用只读 foo
获得所需的行为
我很确定答案是否定的,但我想我还是应该问一下。能否在派生的纯 QML 中创建 属性 readonly/constant class?
// Base.qml
Item {
property int foo: 42
}
// Derived.qml
Base {
foo: 99 // Make constant somehow!
}
我目前正在通过检测 foo
中的变化并将错误打印到控制台来解决这个问题,但这很难说是好的 API...
我有一个菜单项 class,它可以代表菜单项、子菜单、分隔符等。我需要专门化它的行为,但是 只有 在子菜单模式。我可以更改继承树,因此我为每个菜单类型都有一个 subclass,但这看起来很愚蠢,因为每个 subclass 将只包含一个 readonly
属性。但是,如果没有其他方法,我将不得不这样做。
为什么不对私有 foo 使用继承 getter/setters? 类似于:
//Base.qml
Item
{
QtObject
{
id : privateFoo
property int foo : 42
}
function getFoo() {return privateFoo.foo;}
function setFoo(newFoo) { privateFoo.foo = newFoo; }
}
//derived.qml
Base
{
function getFoo() {return 99;}
function setFoo(newFoo) { /*do nothing */ }
}
(我没有测试过这段代码)
您还可以将 foo
作为 readonly alias
转换为内部 属性 _foo
,您将仅将其用于派生 class 中的赋值:
// Base.qml
Item {
id: base
readonly property alias foo: base._foo
property int _foo: 42 // only used for assignment in subclasses
}
要在另一个组件中使用:
Item {
Base {
id: child0
}
Base {
id: child1
_foo: 99
}
Base {
id: child2
_foo: child1.foo
}
Component.onCompleted: {
console.log("child0:", child0.foo,"child1:", child1.foo, "child2:", child2.foo)
child1.foo = 5 // not allowed!
console.log("child0:", child0.foo,"child1:", child1.foo, "child2:", child2.foo)
}
}
输出:
child0: 42 child1: 99 child2: 99
TypeError: Cannot assign to read-only property "foo"
注:当然以后还是可以修改_foo
的。但是,如果您记得仅将它用于赋值,那么您将在派生的 class.
foo
获得所需的行为