Qt QML Flickable with TextArea:contentY的属性绑定被谁覆盖?

Qt QML Flickable with TextArea:contentY的属性绑定被谁覆盖?,qt,qml,qtquick2,qquickitem,Qt,Qml,Qtquick2,Qquickitem,我正在做一个终端部件。当更新TextArea.text时,我希望Flickable向下滚动到最新的输入。我的代码如下所示 ColumnLayout { anchors.fill: parent Flickable { id: scroller clip: true contentY: contentHeight - height onContentYChanged: { console.log

我正在做一个终端部件。当更新
TextArea.text
时,我希望
Flickable
向下滚动到最新的输入。我的代码如下所示

ColumnLayout {
    anchors.fill: parent
    Flickable {
        id: scroller
        clip: true
        contentY: contentHeight - height
        onContentYChanged: {
            console.log("contentY:", contentY)
        }
        TextArea.flickable: TextArea {
            id: textArea
            Layout.fillWidth: true
        }
        Layout.fillWidth: true
        Layout.fillHeight: true
    }
    RowLayout {
        id: prompt
        Label {
            text: " > $ "
        }
        TextField {
            id: textInput
            Layout.fillWidth: true
        }
    }
}
当我运行此命令时,我看到
contentY
在我的绑定设置后立即被覆盖:

qml: contentY: 1498
qml: contentY: 0
qml: contentY: 1517
qml: contentY: 0
我检查以确保我的绑定没有将其设置为0。我尝试使用
export QT\u LOGGING\u RULES=“QT.qml.binding.removation.info=true”
调试绑定循环,结果一目了然。我查看了Flickable的源代码,我认为其中的任何方法都不是罪魁祸首


绑定
contentY
是我想要的正确方式吗?为什么我的绑定没有得到尊重?

问题是,随着Flickable内部内容的移动,
contentY
将不断被Flickable覆盖。您不能在其上放置绑定,因为正如您所看到的,它将立即被静态值覆盖,该静态值在用户与flickable交互时更新

你需要做的是

onContentHeightChanged: Qt.callLater(() => contentY = contentHeight - height)

现在,无论文本区域何时增长,它都会通过立即赋值跳转内容,而不是试图依赖绑定。callLater可确保在flickable由于高度变化而自行将contentY重置为0后发生此情况。

问题在于,
contentY会随着flickable内部内容的移动而不断被其覆盖。您不能在其上放置绑定,因为正如您所看到的,它将立即被静态值覆盖,该静态值在用户与flickable交互时更新

你需要做的是

onContentHeightChanged: Qt.callLater(() => contentY = contentHeight - height)

现在,无论文本区域何时增长,它都会通过立即赋值跳转内容,而不是试图依赖绑定。callLater确保在flickable由于高度更改而自行将contentY重置为0后发生此情况。

不幸的是,在0之前调用了
onContentHeightChanged
。因此,我在那里所做的也被丢弃。请尝试我添加到答案中的更改。不幸的是,在0之前调用了
onContentHeightChanged
。因此,我在那里所做的也被丢弃了。试试我在答案中添加的更改。