【发布时间】:2015-09-11 16:07:56
【问题描述】:
我需要做什么:我需要在 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)
}
}
问题是,即使我设置了最后一个contentY,在模型更改之前,列表仍然会跳动一点(几个像素,而不是在结尾或开头)并且它并不总是跳跃。当我转到列表顶部并打印 contentY 我得到负值。理论上,列表开头的contentY应该是0。
谁能告诉我出了什么问题?或者也许建议另一种解决方案来创建我的消息列表?
比你提前! :)
【问题讨论】:
-
你如何填充/修改
contact.messages? -
这是一个使用 qqmllistproperty 从 c++ 公开的列表。当它从 c++ 修改时(添加消息后)我发出一个信号,来自 qml 的列表视图知道更新它的模型
-
MovementEnded处理程序是否一直被调用?从未使用QQmlListProperty作为模型,但它似乎可以工作quite fine。无论如何,QAbstractListModel的子类可以完美地完成这里的工作。 -
QAbstractItemModel或任何子类都可以。由于ListView确实使用QAbstractListModel显示列表更好。至少如果您不必在树结构中移动。这似乎不是你的情况。 -
感谢@BaCaRoZzo 的建议。我使用了 QAbstractListModel,现在它可以工作了。
标签: qt listview model qml qtquick2