我想为任意模型的ListView
创建一个编辑委托。在委托中,我想使用从TextInput
继承的自己的NeatInput
。NeatInput
声明自己的属性realValue
,将text
绑定到realValue
,并且为了使其双向,在textChanged
信号更改realValue时。如预期:
/*NeatInput.qml*/
import QtQuick 2.0
TextInput {
width: 50
property real realValue: 0.0
text: realValue * 2
onTextChanged: {
realValue = Number.fromLocaleString(locale, text) / 2
}
}
现在,它在ListView
中被简单地用作委托,在模型的someValue
上绑定realValue
,并且出于编辑目的,在realValueChanged
:上写入someValue
/*main.qml*/
import QtQuick 2.12
import QtQuick.Controls 2.12
ApplicationWindow {
width: 500
height: 500
visible: true
ListView {
id: view
model: ListModel {
ListElement {
someValue: 50
}
}
anchors.fill: parent
delegate: Row {
NeatInput {
realValue: someValue
onRealValueChanged: someValue = realValue
}
SpinBox {
value: someValue
onValueChanged: someValue = value
}
Text {
width: 50
text: someValue
}
}
}
}
Text
用于简单阅读,SpinBox
用于标准项的读/写。
但这并没有像我预期的那样奏效:
- 从
SpinBox
编辑仅更新Text
- 从
NeatInput
进行编辑将更新SpinBox
和Text
因此,NeatInput
在someValue
上的绑定以某种方式被破坏,但写入工作。如果我从NeatInput.qml
中移除信号绑定onTextChanged
,则:
- 从
SpinBox
编辑更新Text
和NeatInput
- 从
NeatInput
进行编辑时,什么都不更新
我应该怎么做才能让更新从两个编辑器到所有读者?
一般经验法则始终是:赋值破坏绑定。无论何时:
onTextChanged: {
realValue = Number.fromLocaleString(locale, text) / 2
}
它打破了你在这里创建的绑定:
realValue: someValue
因此,text
第一次更改时,realValue
将停止侦听对someValue
的更新。
双向绑定总是很棘手,因为它们会变成圆形。我用你的代码玩了一分钟,并通过这样做使其工作:
ListView {
id: view
model: ListModel {
ListElement {
someValue: 50
}
}
anchors.fill: parent
delegate: Row {
NeatInput {
realValue: someValue
onRealValueChanged: someValue = realValue
property real someValueCopy: someValue
onSomeValueCopyChanged:
{
realValue = someValueCopy;
}
}
SpinBox {
value: someValue
onValueChanged: someValue = value
}
Text {
width: 50
text: someValue
}
}
}