我有一个 QML 应用程序,里面有一个 ScrollView 和一个 ListView。 ListView 中的项目具有可变高度。
我需要知道滚动条何时移动,事实上,它何时位于底部以及何时不。我的目标是当我将项目添加到 ListView
only(如果滚动位于底部)时,将滚动条保持在底部(
positionViewAtEnd()
)。如果不在底部,positionViewAtEnd()
将不会被使用。
我尝试过用
height
、contentHeight
和 contentY
“玩”。有时它有效(当滚动位于底部时:contentHeight == contentY + height
),但其他时候,contentY
值更改为负值,并且我的代码失败。
我如何实现这一目标?
我尝试过在几个属性更改中使用
atYEnd
来检测滚动条是否位于底部。
它似乎有效,然后我在
onCountChanged
中使用它来将(或不)滚动条放在底部。
一旦所有 ListView 高度都充满消息,就可以工作,但 not 在 one 情况下:当传入消息是填充 ListView 高度的消息时(
contentY
第一次是 not 0
) .
我简化了要测试的代码(包括委托):
FocusScope {
clip: true
id: focusScopeView
width: parent.width; height: parent.height
ScrollView {
width: parent.width; height: parent.height
ListView {
id: listTexts
width: parent.width; height: parent.height
property bool bScrolled: false
model: textsModel
delegate: Text { text: "Contact:\t" + eventText }
onCountChanged: {
if (!bScrolled)
positionViewAtEnd();
}
onContentYChanged: {
bScrolled = !atYEnd;
if (atYEnd)
positionViewAtEnd()
}
onContentHeightChanged: {
if (!bScrolled)
positionViewAtEnd();
}
}
}
}
ListView {
onContentYChanged: {
if (contentY === contentHeight - height) {
console.log("scrolled to bottom");
}
}
}
ScrollView {
flickableItem.onContentYChanged: {
if (flickableItem.contentY === flickableItem.contentHeight - viewport.height) {
console.log("scrolled to bottom");
}
}
}
ListView {
ScrollBar.vertical: ScrollBar {
id: taskScroll
}
property bool atBottom: (taskScroll.position + taskScroll.size) == 1
}