Qt 如何在委托中手工制作的项目中将属性从模型正确绑定到属性?
我想为任意模型的Qt 如何在委托中手工制作的项目中将属性从模型正确绑定到属性?,qt,qml,qt5,qtquickcontrols2,Qt,Qml,Qt5,Qtquickcontrols2,我想为任意模型的列表视图创建一个编辑委托。 在委托中,我想使用从TextInput继承的我自己的NeatInputNeatInput声明自己的属性realValue,将text绑定到realValue,并在textChanged信号更改realValue时使其双向。正如预期的那样: /*NeatInput.qml*/ 导入QtQuick 2.0 文本输入{ 宽度:50 不动产真实价值:0.0 文本:realValue*2 ContextChanged:{ realValue=Number.fro
列表视图
创建一个编辑委托。
在委托中,我想使用从TextInput
继承的我自己的NeatInput
NeatInput
声明自己的属性realValue
,将text
绑定到realValue
,并在textChanged
信号更改realValue时使其双向。正如预期的那样:
/*NeatInput.qml*/
导入QtQuick 2.0
文本输入{
宽度:50
不动产真实价值:0.0
文本:realValue*2
ContextChanged:{
realValue=Number.fromLocaleString(区域设置,文本)/2
}
}
现在,它在ListView
中仅用作委托,在模型中的someValue
上绑定realValue
,并且出于编辑目的,在realValueChanged
时写入someValue
:
/*main.qml*/
导入QtQuick 2.12
导入QtQuick.Controls 2.12
应用程序窗口{
宽度:500
身高:500
可见:正确
列表视图{
id:视图
模型:ListModel{
李斯特伦{
someValue:50
}
}
锚定。填充:父级
代表:世界其他地区{
尼廷普特{
realValue:someValue
onRealValueChanged:someValue=realValue
}
旋转箱{
值:someValue
onValueChanged:someValue=value
}
正文{
宽度:50
文本: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
}
}
}
而对于标准的旋转框则不是这样的,因为它是C++内部的,而且有手动绑定的双向写的,对吧?