簡體   English   中英

為什么Qt QML無法正確綁定屬性?

[英]Why Qt QML doesn't properly bind properties?

這很奇怪,因為我在另一個QML文件中使用了幾乎相同的模式,並且可以正常工作! 我確定我不會在任何地方重新分配值(我所知道的唯一可使屬性靜態化的東西)! 我有這樣的事情(這是一個簡化的示例,可能按預期工作):

Item {
    property bool isExpanded: false
    MouseArea {
        anchors.fill: parent
        onClicked: {
            isExpanded = !isExpanded
            console.log(isExpanded)
            console.log(myId.visible)
        }
    }
    MyCustomItem {
        id: myId
        visible: isExpanded
        // other stuff
    }
}

單擊后, IsExpanded發生更改,但Item可見性始終保持不變! 我的商品還有許多其他屬性(例如height: isExpanded ? someval : 0 ),也不會改變! 如果我總是手動更改所有內容,那是可行的,那又有什么意義呢? 在另一個QML中,我使用了類似的模式,並且可以正常工作!

但! 例如,如果我按下onDoubleClicked /另一個按鈕,請按以下步驟: myId.visible = Qt.binding(function() {return isExpanded})可以正常工作! 因此,由於某種未知的原因,它不應該在常規屬性聲明中將它們“綁定”( visible: isExpanded )。

所以問題是,我真的需要明確地告訴Qt綁定屬性以使其起作用嗎?

編輯:要明確:我確定我不會在任何地方重新分配可見屬性。 我檢查了一下。 盡管qml大小僅約100行,但我使用ctrl + f查找了可見的任何內容,除了已提及的內容外,沒有發現任何內容。 如果有更可靠的方法來告訴您是什么/檢查某處或某處可能的重新分配,請告知。

所以問題是,我真的需要明確地告訴Qt綁定屬性以使其起作用嗎?

是。

聲明屬性時,可以使用綁定語法,例如visible: isExpanded 但是,使用常規JavaScript語法(即賦值運算符)在命令性代碼中設置屬性將破壞任何現有綁定並覆蓋屬性的值。 如果要在命令性代碼中顯式設置屬性綁定,請使用Qt.binding()方法( docs )。

盡管您的實際問題是由於成為QML范圍界定規則的受害者而造成的。 您的MyCustomItem類型具有isExpanded屬性,因此在聲明時:

MyCustomItem {
    id: myId
    visible: isExpanded
    // other stuff
}

您實際上是對MyCustomItem::isExpanded visible 因此,要明確解決您所指的isExpanded

Item {
    id: base
    property bool isExpanded: false
    MouseArea {
        anchors.fill: parent
        onClicked: {
            isExpanded = !isExpanded
            console.log(isExpanded)
            console.log(myId.visible)
        }
    }
    MyCustomItem {
        id: myId
        visible: base.isExpanded
        // other stuff
    }
}

我發現了問題! 非常不明顯(在任何地方都沒有記錄),並且它默默地失敗了。 問題是MyCustomItem包含與外部booleal屬性isExpanded相同名稱的屬性,因此在此代碼中:

MyCustomItem {
    id: myId
   visible: isExpanded
 // other stuff
}

isExpanded來自MyCustomItem 但是沒有任何跡象。 好吧,現在我知道這可能會發生,並且如果再次發生可能會發現它,但這確實違反直覺。 如果這不是我的物品,而是別人的物品,而我不知道它具有這種性質怎么辦? Qt創作者至少可以警告可能存在歧義。

暫無
暫無

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

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