获取列表视图委托qml的可见性状态

时间:2017-03-15 14:32:53

标签: qml

我正在研究聊天系统,我有一个带有列表视图的对话页面,列表视图代表是文本对话。我想在会话代表中添加看/看不见或已读/未读,列表视图由自定义模型提供,我需要像委托附加属性一样,当委托实际被查看时会更改。是否有任何附加财产告诉我每个代表项目的可见性状态?

1 个答案:

答案 0 :(得分:3)

您有两个问题需要解决:

  1. 如何存储已查看邮件的信息
  2. 何时将其设置为已读。
  3. 所以一个接一个......

    delegate中的自定义属性不是一个好主意,因为delegate将离开{{1}的视口时,存储在其中的信息将会丢失并被摧毁。

    最佳解决方案是将其存储在ListView模型中。这样,如果ListView有点持久,也可以在重新启动应用程序时保留信息。
    也许你可能会在我提出的下一个选项中与model结合使用,但我会认为这是一种hackish。

    如果无法做到这一点,并且信息不需要在应用重启后继续存在,您需要考虑将其存储在Settings之外的方法。例如,您可以使用ListViewarray来存储它(注意:无更改通知)。您也可以使用另一个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中的角色,请将其放在那里!