如何找到所有可见的深层嵌套 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】:ListView
是Flickable
的子类,它的所有代表都是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 项目?的主要内容,如果未能解决你的问题,请参考以下文章