2017-12-10 11 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のドキュメントを見ると、設定できるフラグがありますが、Pythonで設定する方法がわかりませんし、自分のニーズに合っているかどうかはわかりません。

今のところ、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

これは私が必要としていたことに対して非常にうまく機能しました。ありがとうございました。 –

関連する問題