QML:在派生类中使属性只读

时间:2015-02-27 16:37:20

标签: qt qml

我很确定答案是否定的,但我认为无论如何我都应该问。可以在纯QML派生类中使继承属性成为readonly / constant吗?

// Base.qml
Item {
    property int foo: 42
}

// Derived.qml
Base {
    foo: 99 // Make constant somehow!
}

我目前通过检测foo中的更改并将错误打印到控制台来解决此问题,但这几乎不是良好API的标志......

我有一个菜单项类,它可以表示菜单项,子菜单,分隔符等。我需要专门化它的行为,但仅在处于子菜单模式时。我可以更改继承树,因此每个菜单类型都有一个子类,但这似乎很愚蠢,因为每个子类只包含一个readonly属性。但是,如果没有其他方式,我将不得不这样做。

2 个答案:

答案 0 :(得分:2)

为什么不为私有foo使用继承的getter / setter? 类似的东西:

//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 */ }
}

(我还没有测试过这段代码)

答案 1 :(得分:0)

您还可以将Resource1转换为thread1到内部属性foo,您只能在派生类中进行分配:

readonly alias

在另一个组件中使用:

_foo

输出:

// 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" 的行为。