2017-12-10 3 views
1

QTreeWidgetItemIterator을 필터링하여 검사 할 수없는 항목이 결과에서 누락되지 않도록 할 수 있습니까? 이 예에서 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 

,도 Header1 또는 Header2는 체크 할 수 있지만, 그 아래에있는 항목은 다음과 같습니다. QTreeWidget을 반복 할 때 전체 목록을 반환합니다.

IteratorFlags에 대한 설명서를 보면 설정할 수있는 플래그가 있음을 알 수 있지만 파이썬으로 설정하는 방법을 이해할 수 없으며 그 중 어떤 것이 내 요구에 맞는지 확신 할 수 없습니다. .

지금, val.isCheckable()AttributeError이됩니다. 예상대로, isCheckable()QTreeWidgetItem의 속성으로 보이지 않습니까?

바람직하지 않은 항목을 걸러 내고 싶습니다. 그러나 이것이 가능하지 않은 경우, isCheckable() 값을 확인하려면 어떻게해야합니까?

답변

1

클래스 QTreeWidgetItem 클래스는 기본적으로 선택 가능하며 검사 가능 상태에 대한 접근 자 메서드가 없습니다. 그래서 대신 아이템 플래그를 사용해야합니다

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

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

이를 감안할 때, 당신은 또한 체크 할 수 할 명시 적으로 해제에 당신이하지을 항목에 대한 플래그가 필요합니다

+0

이것은 내가 필요한 것에 매우 잘 맞았습니다. 고맙습니다. –

관련 문제