如何过滤掉QTreeWidgetItemIterator中不可检查的结果?

时间:2017-12-10 16:41:33

标签: python iterator pyqt pyqt5 qtreewidgetitem

是否可以过滤QTreeWidgetItemIterator以便从结果中省略不可检查的项目?

TreeList = ({
    'Header1': (('Item11', 'Item12', )),
    'Header2': (('Item21', 'Item22', )),
})

# LOCATED IN `initLayout` METHOD
for key, value in TreeList.items():
    parent = QTreeWidgetItem(self.ListTreeView, [key])
    for val in value:
        child = QTreeWidgetItem([val])
        child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
        child.setCheckState(0, Qt.Unchecked)
        parent.addChild(child)

# LOCATED IN `initialize` METHOD
iterator = QTreeWidgetItemIterator(self.ListTreeView)
while iterator.value():
    val = iterator.value()

    try:  # Results in object has not attribute
        if val.isCheckable():
            print('checkable')
    except AttributeError as e:
        print(e)

    iterator += 1

在此示例中,Header1Header2都不可检查,但位于其下的项目是。当我遍历QTreeWidget时,它返回整个列表。

查看IteratorFlags的文档,我可以看到有可以设置的标志,但我不明白如何在Python中设置它们,我不确定他们中的任何一个都符合我的需要。

目前,val.isCheckable()会产生AttributeError;这是预期的,因为isCheckable()似乎不是QTreeWidgetItem的属性 - 或者是它?

我希望过滤掉不可检查的项目,但如果无法检查,我该如何检查价值isCheckable()

1 个答案:

答案 0 :(得分:1)

默认情况下,QTreeWidgetItem类是可检查的,并且没有可检查状态的访问器方法。所以你需要使用item-flags:

iterator = QTreeWidgetItemIterator(self.ListTreeView)
while iterator.value():
    val = iterator.value()
    if val.flags() & Qt.ItemIsUserCheckable:
        print('checkable')
    iterator += 1

鉴于此,您还需要明确取消 想要检查的项目的标记:

for key, value in TreeList.items():
    parent = QTreeWidgetItem(self.ListTreeView, [key])
    # remove checkable flag for header items
    parent.setFlags(parent.flags() & ~Qt.ItemIsUserCheckable)