如何在更改模型时停止ListView以"跳转"

Isp*_*diu 9 qt listview model qml qtquick2

我需要做的是:我需要使用存储聊天消息的QML 创建聊天窗口ListView.我设置listView.positionViewAtEnd()为了跟随最后的消息.positionViewAtEnd当我向上滚动时,我禁用,这样我每次收到新消息时都可以读取过去的消息,而不会跳到最后.

问题:向上滚动后,每次收到新消息时,它都会跳到列表的开头.为了解决这个问题,我设法存储contentY列表并在每次onCountChanged调用处理程序时重置它(请参阅下面的代码):

ListView {
    id: messagesList
    model: contact? contact.messages: []
    delegate: delegate
    anchors.fill: parent
    anchors.bottomMargin: 20
    height: parent.height
    anchors.margins: 10

    property int currentContentY

    onMovementEnded: {
       currentContentY = contentY
    }

    onCountChanged: {
        contentY = currentContentY
    }
    onContentYChanged: {
        console.log(".....contentY: " + contentY)
    }
}   
Run Code Online (Sandbox Code Playgroud)

问题是,即使我设置了最后一个contentY,在模型更改之前,列表仍然会跳转一些(几个像素,而不是结束或开始)并且它不会始终跳转.当我走到列表的顶部并打印出来时,contentY我会得到负值.理论上,contentY在列表的开头应该是0.

有人能告诉我出了什么问题吗?或者可能建议另一种解决方案来创建我的消息列表

比你提前!:)

Cri*_*dan 0

为什么不使用 onCountChanged 插槽来在末尾设置 ListView ?

onCountChanged: {
   messagesList.positionViewAtEnd()
}
Run Code Online (Sandbox Code Playgroud)