【问题标题】:Obtaining visibility status of list view delegate qml获取列表视图委托 qml 的可见性状态
【发布时间】:2017-03-15 14:32:53
【问题描述】:

我正在开发聊天系统,我有一个对话页面,里面有一个列表视图,列表视图代表是文本对话。我想向对话代表添加看到/未看到或已读/未读,由自定义模型提供的列表视图,我需要像代表附加属性这样的东西,当实际查看代表时会发生变化。是否有任何附加属性可以告诉我每个委托项目的可见性状态?

【问题讨论】:

  • 嗯,visible-property 告诉你它是可见的还是隐藏的。否则,您可能需要定义自定义属性并自行设置。
  • 我检查了可见性,但是当委托不完全可见时可见性变为真,能否请更清楚地了解自定义属性?
  • 看看QML Properties。基本上,您可以在通常的属性之外定义自己的属性。例如,您可以为您的用例定义property bool isRead。为了设置该属性,您需要定义自己的信号处理程序,相应地调整您的 QML 对象。一种方法是:使用 Listview 的 indexAt()- 方法来检测您的委托当前是否可见。或者用 ListView 的边界框跟踪代表位置。

标签: qml


【解决方案1】:

你有两个问题要解决:

  1. 如何存储已查看消息的信息
  2. 何时将其设置为已读。

就这样一个接一个……

delegate 中的自定义属性 不是一个好主意,因为一旦delegate 离开ListView 的视口并被销毁,其中存储的信息就会丢失。

最好的解决方案是将其存储在ListView 的模型中。这样,如果 model 有点持久化,则该信息也可能在应用程序重新启动后仍然存在。
也许您可能会通过我将介绍的下一个选项与@​​987654327@ 结合来实现一些目标,但我会认为这是骇人听闻的。

如果这是不可能的,并且信息不需要在应用重新启动后仍然存在,那么您需要考虑一种将其存储在 ListView 之外的方法。例如,您可以使用arrayobject/dictionary 来存储它(注意:没有更改通知)。您还可以使用第二个 ListView 保持同步(这可能证明并不容易!)。

最后,您可以将 ListView 作为模型放入 Instantiator 中,它使用一个属性实例化简单的 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'
        }
    }
}

现在是第二部分:什么时候真正阅读

您已经发现的可见性问题。 Items 在为 buffer 创建时,即使在 listView 之外也可见。所以你不能使用这些信息。但是你有以下信息:

  • listModel.contentItem 的位置(x 和 y)
  • delegate 相对于listModel.contentItem 的位置
  • delegate 的宽度和高度

所以你可以说:delegate 是完全可见的,如果:

  • listModel.contentItem.x + delegate.x &gt;= 0
  • listModel.contentItem.y + delegate.y &gt;= 0
  • listModel.contentItem.y + delegate.y + delegate.height &lt;= listModel.height
  • listModel.contentItem.x + delegate.x + delegate.width &lt;= listModel.width

一个例子,关于Item如何检查它是否在Flickable中可见(记住:ListViewISFlickable)可以找到here

这是:如果有可能让整个委托都拥有视图。如果它更大 - 那么您需要在委托被视为已读取时定义一些标准。

但同样:如果有任何可能将其作为您的model 中的角色,请将其放在那里!

【讨论】:

  • 能否再解释一下第二部分?!
  • 如果你告诉我,具体是什么,肯定的。
  • 我使用了您在 onYchanged of delegates 中提到的条件,但它没有按预期工作,即使他们不在视图中,也会创建委托,因此我们需要一些条件来检查委托当前是否存在是否在视图中,还有一个要检查的事件,那么我应该使用什么事件来正确触发委托组件中的列表视图轻弹?
  • 我添加了一个指向最近示例的链接,其中 dtech 解释了如何确定Items 在Flickable 中的可见性。它只考虑了Itemy 坐标,而忽略了height,但应该很容易将此示例扩展为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多