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

问题描述 投票:0回答:1

我正在做一个终端小部件。我想让 Flickable 的时候,向下滚动到最新的输入。TextArea.text 是更新的。我的代码如下。

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_LOGGING_RULES="qt.qml.binding.removal.info=true",出来的是干净的。我看了一下来源 Flickable 而我不认为那里的任何一种方法是罪魁祸首。

是绑定 contentY 正确的方式来做我想做的事?为什么我的绑定不被尊重?

qt qml qtquick2 qquickitem
1个回答
2
投票

问题是 contentY 将会被Flickable不断地覆盖,因为它里面的内容在移动。你不能对它进行绑定,因为正如你所看到的,它会立即被一个静态值覆盖,这个静态值会随着用户与flickable的交互而更新。

你需要做的是像这样的事情

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

现在,每当文本区域增长时,它将通过立即赋值来跳转contentY,而不是试图依赖绑定。callLater确保在flickable因高度变化而自行将contentY重置为0后发生。

© www.soinside.com 2019 - 2024. All rights reserved.