Вы можете временно переопределить привязки, используя состояния, как в приведенном ниже коде.
Настоящая проблема здесь заключается в обнаружении изменения внешнего значения, в моем решении я использую Timer
для этого, но ваши требования требуют, чтобы внешняя ценность снова изменилась. Так как вы внешне привязываетесь к свойству text
, а также перекрываете привязку к text
, вы временно теряете сигналы изменения из внешней привязки, поэтому не можете отменить временную привязку.
Если у вас есть контроль над виджетом Я хотел бы реализовать свойство, которое должно быть установлено внешне и внутренне присваивать это значение туда, где оно должно go. Это дает вам возможность получать изменения и, например, останавливать tempBoundedTimer
(так как я все еще думаю, что у вас должен быть таймер, чтобы не переопределять привязку на неопределенный срок в случае, если внешнее значение не обновляется).
Если у вас нет контроля над виджетом, я бы остановился на подходящем интервале для tempBoundedTimer
(В любом случае, я не добавляю таймер в каждом экземпляре виджета, это очень приятно)
import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow {
visible: true
width: 640
height: 480
property real externalValue: (Math.random()* 50).toFixed(0)
Timer {
running: true
repeat: true
interval: 1000
onTriggered: {
// Simulate externalValue changes out of our control
externalValue = (Math.random()* 50).toFixed(0)
}
}
Component.onCompleted: {
// Unknown external binding set by developer using textItem widget
textItem.text = Qt.binding(function(){return externalValue})
}
Column {
Text {
id: textItem
text: ""
property real internalValue: (Math.random()* 50).toFixed(0)
Timer {
id: tempBoundedTimer
repeat: false
interval: 2000
}
states: [
State {
when: tempBoundedTimer.running
PropertyChanges {
target: textItem
text: "internal:" + internalValue
}
}
]
}
Button {
text: "Change Internal Value"
onClicked: {
textItem.internalValue = (Math.random()* 50).toFixed(0)
tempBoundedTimer.start()
}
}
}
}
Кстати, я думаю, что ваш объект Binding действительно должен работать, если when
связан с tempBoundedTimer.running
, но я не смог заставить его играть хорошо. Кажется, Qt.binding
имеет приоритет