[英]Qt/QML SwipeDelegate doesn't work properly on mobile devices (Android, iOS)
[英]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.