QML Flickable with TextArea:属性 contentY 的绑定被覆盖 - 被谁覆盖?
QML Flickable with TextArea: property binding for contentY is overwritten - by whom?
我正在制作一个终端小部件。我希望 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
是做我想做的事情的正确方法吗?为什么我的绑定没有被遵守?
问题是,随着 Flickable 内部内容的移动,contentY
会不断地覆盖它。您不能对其进行绑定,因为如您所见,它会立即被一个静态值覆盖,该静态值会随着用户与 flickable 交互而更新。
你需要做的是
onContentHeightChanged: Qt.callLater(() => contentY = contentHeight - height)
现在,每当文本区域增大时,它都会通过立即赋值跳转 contentY,而不是尝试依赖绑定。 callLater 确保它发生在 flickable 由于高度变化而自行将 contentY 重置为 0 之后。
我正在制作一个终端小部件。我希望 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
是做我想做的事情的正确方法吗?为什么我的绑定没有被遵守?
问题是,随着 Flickable 内部内容的移动,contentY
会不断地覆盖它。您不能对其进行绑定,因为如您所见,它会立即被一个静态值覆盖,该静态值会随着用户与 flickable 交互而更新。
你需要做的是
onContentHeightChanged: Qt.callLater(() => contentY = contentHeight - height)
现在,每当文本区域增大时,它都会通过立即赋值跳转 contentY,而不是尝试依赖绑定。 callLater 确保它发生在 flickable 由于高度变化而自行将 contentY 重置为 0 之后。