没有循环的双向 QML 绑定

Bi-directional QML binding without loop

我的应用程序的用户可以单击图像并将其拖动到 select 感兴趣的区域。我还想要一个 TextField,用户可以在其中手动调整值,但我一直无法让绑定正常工作。

我的第一次尝试看起来像

Column {
    property ROI roi
    Label { text: "Minimum X" }
    TextField {id: min_x; text: roi.pointMin.x}
}

这会在文本字段中正确显示当前的 x 坐标。但是,当我编辑文本字段时,位置不会更新。我可以使用以下代码更正此问题。

Column {
    property ROI roi
    Label { text: "Minimum X" }
    TextField {id: min_x; text: roi.pointMin.x}
    Binding {
        target: roi
        property: "pointMin.x"
        value: min_x.text;
    }
}

这正确地建立了双向绑定,该双向绑定在用户绘制新的感兴趣区域时和用户通过 TextField 更新时都会更新。但是,日志中充斥着有关存在绑定循环的消息。绑定循环的位置很明显,但是如何在不丢失功能的情况下删除它?

如果重要的话,roi.pointMin 是一个 QPoint。

编辑:我没有提到的一个关键点是我一直在努力保持完全声明式并避免使用事件处理程序。这排除了网站上提供的许多其他解决方案,但可能是一个不可能的问题。

为此特定目的,您可以使用 textEdited() of the TextField 来检测用户输入的变化,而不是绑定到 text 属性.

Column {
    property ROI roi
    Label { text: "Minimum X" }
    TextField {
        id: min_x; 
        text: roi.pointMin.x
        onTextEdited: function() {
            roi.pointMin.x = min_x.text
        }
    }
}