如何找到所有可见的深层嵌套 ListView 项目?

Posted

技术标签:

【中文标题】如何找到所有可见的深层嵌套 ListView 项目?【英文标题】:How to find all visible deeply nested ListView items? 【发布时间】:2019-08-14 09:36:56 【问题描述】:

我正在做一个基于 squish 的测试,并尝试从 QML ListView 中获取体面(可见)的项目,这些项目由于其动态行为而无法选择

我已经通过使用带有对象映射名称的 waitForObject 来获取列表本身

列表中有几个嵌套项,当属性 visible 为 true 时,我想获取所有出现的 MyTypeCCC_QMLTYPE_72

我已经抛弃了我当前的类/属性子层次结构:

MyTypeAAA_QMLTYPE_195
  children[0] QQuickItem
    children[0] QQuickColumn
      children[0] MyTypeBBB_QMLTYPE_189
        children[0] MyTypeCCC_QMLTYPE_7 visible(true)

我在 Squish-KB 中找到了这个:https://kb.froglogic.com/display/KB/Example+-+Finding+child+objects+by+type+and+property+values

所以我可以编写自己的搜索代码遍历树等,但我认为这可能(应该)是一个更简单的解决方案?

我可以依赖确切的层次结构吗? (但我 UI 设计 再次改变了) 如果有帮助的话,我可以将 ID 添加到 MyTypeCCC_... 我有几个不同类型/嵌套的列表,我希望找到一个适用于所有/许多情况的简单解决方案

有什么想法吗?

【问题讨论】:

【参考方案1】:

ListViewFlickable 的子类,它的所有代表都是ContentItem 的直接子类,您可以安全地遍历其子类以获取所有列表项,但请注意不是全部 它的孩子是列表代表,所以你必须过滤它们,例如通过type。要查找嵌套元素,只需在列表项中搜索它们,即使用列表项作为容器。要创建容器定位器,您可以使用其坐标(这些是列表中的坐标,因此它们将是唯一的)。代码可能如下所示:

list_view = findObject(list_locator)
nested = []
for i in range(list_view.contentItem.children.count):
    item = list_view.contentItem.children.at(i)
    if className(item) == 'MyTypeAAA':
        netsed.append(findObject('container': 'x': item.x, 'y': item.y, 'type': className(item), 'type': 'MyTypeCCC'))

【讨论】:

那么具有深度嵌套项的非 ListView 项呢 - 是否有某种过滤器功能(XPath 之类的东西?)还是我需要沿着子层次结构向下移动并自己找到想要的内容? @llm 没有通用解决方案,但通常您不需要遍历整个树,而只需使用最顶层的容器,您要查找的元素是唯一的并在其中搜索。此外,如果您不关心结构,而只想获取具有某些属性的所有元素,请使用 findAllObjects 来返回所有匹配的元素,而不管它们在对象树中的位置。

以上是关于如何找到所有可见的深层嵌套 ListView 项目?的主要内容,如果未能解决你的问题,请参考以下文章

获取 ListView 可见项

在深层嵌套对象中按特定键查找所有值

为啥不可见的虚拟 ListView 的项目没有索引?

如何从适配器知道 ListView 的项目是不是可见?

如何滚动 ListView 中的项目使其可见?

找出 ListView 中的哪些项目是可见的