簡體   English   中英

Qml屬性掛鈎

[英]Qml property hooks

假設存在一個名為Test且具有foo屬性的Qml類型,其實現方式如下: Test.qml

// Not necessarily QtObject, but derived from QObject
QtObject {
    // Not necessarily var/property, but must behave like property (i.e. be accessible using "<instance>.foo")
    property var foo
}

並以以下方式使用: main.qml

import "."

Test {
    id: _test
}

function baz() {
    var x = _test.foo;
    _test.foo = x;
}

我想要的是每次getter或setter訪問foo屬性時都會收到通知。 對於二傳手,也許我可以使用fooChanged信號,但是對於getter沒有這樣的解決方案。 我也可以使用Q_PROPERTY宏將Test類型實現為C++類,並從屬性getter / setter發出相應的信號,但是我真的很想將大多數代碼留在Qml方面。

還有其他方法可以掛接Qml屬性訪問嗎?

好的,經過幾個小時的搜索,閱讀了Qml和JS文檔后,我想我終於找到了解決方案。 由於Qml不完全支持JS,因此涉及一些黑客,但是此解決方案仍然有效。 主要思想是使用JS defineProperty方法,以便向現有對象動態添加屬性。 現在我的Test.qml文件如下所示:

QtObject {
    // NOTE: .defineProperty does not correctly work for Qml objects, so JS object is used instead
    property var object: { return {}; }

    Component.onCompleted: {
        Object.defineProperty(
            object,
            "foo",
            {
                get: function () {
                    // getter handling here
                },
                set: function (value) {
                    // setter handling here
                }
            }
        );
    }
}

而在main.qml _test情況聲明如下:

property alias _test: _testDeclaration.object

Test {
    id: _testDeclaration
}

希望這個答案對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM