我正在研究聊天系统,我有一个带有列表视图的对话页面,列表视图代表是文本对话。我想在会话代表中添加看/看不见或已读/未读,列表视图由自定义模型提供,我需要像委托附加属性一样,当委托实际被查看时会更改。是否有任何附加财产告诉我每个代表项目的可见性状态?
答案 0 :(得分:3)
您有两个问题需要解决:
所以一个接一个......
delegate
中的自定义属性不是一个好主意,因为delegate
将离开{{1}的视口时,存储在其中的信息将会丢失并被摧毁。
最佳解决方案是将其存储在ListView
模型中。这样,如果ListView
有点持久,也可以在重新启动应用程序时保留信息。
也许你可能会在我提出的下一个选项中与model
结合使用,但我会认为这是一种hackish。
如果无法做到这一点,并且信息不需要在应用重启后继续存在,您需要考虑将其存储在Settings
之外的方法。例如,您可以使用ListView
或array
来存储它(注意:无更改通知)。您也可以使用另一个object/dictionary
来保持同步(这可能不那么容易!)。
最后,您可以将ListView
作为模型放在ListView
中,它使用一个属性实例化简单Instantiator
:read。
后者是将其存储在代表和模型之外的最简单方法,因此我将向您展示它是如何工作的:
QtObjects
现在第二部分:什么时候实际阅读
您已发现的可见性问题。在为Instantiator {
id: additionalInfo
model: customModel
delegate: QtObject {
property bool read // <--- This is a custom defined property
}
}
ListView {
model: customModel
delegate: MyDelegate {
onRead: additionalInfo.objectAt(index).read = true
Text {
text: additionalInfo.objectAt(index).read ? 'read' : 'unread'
}
}
}
创建Item
时,listView
即使在buffer
之外也会显示。所以你不能使用这些信息。但是您有以下信息:
listModel.contentItem
(x和y)delegate
相对于listModel.contentItem
delegate
所以你可以说:delegate
完全可见iff:
listModel.contentItem.x + delegate.x >= 0
listModel.contentItem.y + delegate.y >= 0
listModel.contentItem.y + delegate.y + delegate.height <= listModel.height
listModel.contentItem.x + delegate.x + delegate.width <= listModel.width
一个例子,关于Item
如何检查Flickable
中是否可见(请记住:ListView
IS a Flickable
)可以找到here
这是:如果可以让整个委托具有视图。如果它更大 - 那么当委托被认为是读时,你需要定义一些标准。
但是又说:如果有任何可能性将其作为model
中的角色,请将其放在那里!