【问题标题】:QML: Make property readonly in derived classQML:在派生类中使属性只读
【发布时间】:2015-02-27 16:37:20
【问题描述】:

我很确定答案是否定的,但我想我还是应该问。可以在纯 QML 派生类中将继承属性设为只读/常量吗?

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

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

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

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

【问题讨论】:

  • 你想在这里得到什么?你需要什么?可能只是有另一种解决方案。
  • @folibis 我已经更新了我的问题。

标签: qt qml


【解决方案1】:

您还可以将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"

注意:当然以后还是可以修改_foo的。但是,如果您记得仅将其用于赋值,那么您在派生类中使用只读 foo 即可获得所需的行为。

【讨论】:

    【解决方案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 */ }
    }
    

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

    【讨论】:

    • 这很好用,我唯一担心的是它不能解决“QML 范式”的问题,即通过操纵属性。话虽如此,属性绑定仍然按预期工作,所以我不能争论太多。
    • 是的,很遗憾,私有属性的约定是在其名称前加上__ 例如。 __foo 在这里,但这并不妨碍任何人修改此属性。这只是表明这个属性应该是内部的。
    • 六年过去了:打勾应该从正确答案中去掉,因为它是错误的。使用“只读属性别名 foo: base._foo”
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多