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

获取列表视图委托qml的可见性状态,qml,Qml,我在聊天系统上工作,我有一个对话页面,里面有一个列表视图,列表视图代表的是文本对话。我想将“已看到/未看到”或“已读/未读”添加到对话代理,列表视图由自定义模型提供,我需要类似“代理附加属性”的内容,该属性在实际查看代理时会发生更改。是否有任何附加属性可以告诉我每个代理项目的可见性状态?您有两个问题需要解决: 如何存储已查看邮件的信息 何时将其设置为已读。 所以一个接一个 委托中的自定义属性不是一个好主意,因为一旦委托离开ListView的视口并被销毁,其中存储的信息就会丢失 最好的解决方案是将

我在聊天系统上工作,我有一个对话页面,里面有一个列表视图,列表视图代表的是文本对话。我想将“已看到/未看到”或“已读/未读”添加到对话代理,列表视图由自定义模型提供,我需要类似“代理附加属性”的内容,该属性在实际查看代理时会发生更改。是否有任何附加属性可以告诉我每个代理项目的可见性状态?

您有两个问题需要解决:

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

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

最好的解决方案是将其存储在ListView的模型中。通过这种方式,如果模型在某种程度上是持久的,那么信息也有可能在重新启动应用程序后存活下来。 也许你可以在下一个选项中加入一些东西,和设置相结合,但是我会考虑这个问题。 如果这是不可能的,并且信息不需要在应用程序重启后保存,那么您需要考虑一种将其存储在ListView之外的方法。例如,您可以使用数组或对象/字典来存储它。注意:无更改通知。您还可以使用另一个保持同步的ListView,这可能并不容易

最后,您可以将ListView作为模型放在实例化器中,该实例化器使用一个属性:read实例化简单的QTObject

后者是将其存储在代理和模型之外的最简单方法,因此我将向您展示它的工作原理:

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'
        }
    }
}
现在来看第二部分:什么时候才能真正读出来

您已经发现的可见性问题。为缓冲区创建项时,即使在listView之外,它们也会变得可见。所以你不能使用这些信息。但您有以下信息:

listModel.contentItem x和y的位置 委托相对于listModel.contentItem的位置 代表的宽度和高度 因此,您可以说:委托是完全可见的:

listModel.contentItem.x+delegate.x>=0 listModel.contentItem.y+委托.y>=0
listModel.contentItem.y+delegate.y+delegate.height您需要解决两个问题:

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

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

最好的解决方案是将其存储在ListView的模型中。通过这种方式,如果模型在某种程度上是持久的,那么信息也有可能在重新启动应用程序后存活下来。 也许你可以在下一个选项中加入一些东西,和设置相结合,但是我会考虑这个问题。 如果这是不可能的,并且信息不需要在应用程序重启后保存,那么您需要考虑一种将其存储在ListView之外的方法。例如,您可以使用数组或对象/字典来存储它。注意:无更改通知。您还可以使用另一个保持同步的ListView,这可能并不容易

最后,您可以将ListView作为模型放在实例化器中,该实例化器使用一个属性:read实例化简单的QTObject

后者是将其存储在代理和模型之外的最简单方法,因此我将向您展示它的工作原理:

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'
        }
    }
}
现在来看第二部分:什么时候才能真正读出来

您已经发现的可见性问题。为缓冲区创建项时,即使在listView之外,它们也会变得可见。所以你不能使用这些信息。但您有以下信息:

listModel.contentItem x和y的位置 委托相对于listModel.contentItem的位置 代表的宽度和高度 因此,您可以说:委托是完全可见的:

listModel.contentItem.x+delegate.x>=0 listModel.contentItem.y+委托.y>=0
listModel.contentItem.y+delegate.y+delegate.height好吧,有一个visible属性告诉你它是可见的还是隐藏的。否则,您可能需要定义自定义属性并自行设置。我检查了可见性,但当代理不完全可见时,可见性变为真,请更清楚地了解自定义属性。请查看。基本上,您可以在常规属性之外定义自己的属性。例如,您可以为您的用例定义属性bool isRead。为了设置该属性,您需要定义自己的信号处理程序,相应地调整QML对象。一种方法是:使用Listview的indexAt方法来检测
r委托当前可见。或者使用ListView的边界框跟踪代理的位置。有一个visible属性可以告诉您它是可见的还是隐藏的。否则,您可能需要定义自定义属性并自行设置。我检查了可见性,但当代理不完全可见时,可见性变为真,请更清楚地了解自定义属性。请查看。基本上,您可以在常规属性之外定义自己的属性。例如,您可以为您的用例定义属性bool isRead。为了设置该属性,您需要定义自己的信号处理程序,相应地调整QML对象。一种方法是:使用Listview的indexAt方法来检测代理当前是否可见。或者使用ListView的边界框跟踪代理位置。请您进一步解释第二部分?!如果你告诉我,具体是什么,可以肯定。我使用了你在“代理列表”中提到的条件,但它没有按预期工作,即使代理不在视图中,也会创建代理,因此我们需要一些条件来检查代理当前是否在视图中,还需要一个事件来检查,那么,我应该使用什么事件来正确触发委托组件中的列表视图flick呢?我添加了一个链接到最近的一个示例,其中dtech解释了如何确定Flickable中的项目可见性。它只考虑了项目的y坐标,忽略了高度,但将此示例扩展为一个解决方案应该很容易。请您进一步解释第二部分好吗?!如果你告诉我,具体是什么,可以肯定。我使用了你在“代理列表”中提到的条件,但它没有按预期工作,即使代理不在视图中,也会创建代理,因此我们需要一些条件来检查代理当前是否在视图中,还需要一个事件来检查,那么,我应该使用什么事件来正确触发委托组件中的列表视图flick呢?我添加了一个链接到最近的一个示例,其中dtech解释了如何确定Flickable中的项目可见性。它只考虑了项目的y坐标,忽略了高度,但应该很容易将此示例扩展为解决方案。