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++内部的,而且有手动绑定的双向写的,对吧?