2017-12-09 5 views
0

私は、隠されたルートを持つQTreeWidget、ヘッダーとして2つの子供、そしてそれらの子の下に2人の子供を持っています。それはおそらく、この例では無関係ですが、私は現在、私はself.CurrentIndexLabelを使用して、現在選択されたラベルを追跡HEADER 1、ITEM 12のsetCheckStateに必要item = {}辞書から変数を使用してQTreeWidgetの子の子のsetCheckedStateを設定するにはどうすればいいですか?

ROOT (HIDDEN) 
    | 
    |- HEADER 1 (CHILD, NOT CHECKABLE) 
    |  | 
    |  |- ITEM 11 (CHILD, CHECKABLE) 
    |  |- ITEM 12 (CHILD, CHECKABLE) 
    | 
    |- HEADER 2 (CHILD) 
    |  | 
    |  | - ITEM 21 (CHILD, CHECKABLE) 
    |  | - ITEM 22 (CHILD, CHECKABLE) 

。私はそのようなのような木を埋めています

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

item = {'Item12': {'ItemEnabled': 1}} # 0 = No, 1 = Yes 

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) 

は当初、私はアイテムがチェック、またはオフ各項目の変数を鋲item = {}辞書に基づいて、ユーザーが項目のチェックを外したときにされているかどうかを設定する必要があり、私はアイテムが有効かどうかを反映するためにitem = {}ディクショナリを変更する必要があります。

変更を検出するために信号とスロットを使用する必要があると仮定しますが、リストの項目をチェックしてフラグを立てる方法がわからないため、ユーザーの確認を反映する方法がわかりませんまたはTreeListの項目のチェックを外してください。

1と0を使用してチェックを追跡したり、チェックを外して辞書item = {}を最新の状態に更新するのが理想的です。

これを達成するにはどうすればよいでしょうか?私はPythonには新しいので、私と一緒にご負担ください。私はPython 3.6とPyQt5を使用しています

+0

私は 'item'辞書の構造があると思う:キーとしてQTreeWidgetItemテキスト値を使用して(まだ良いか、QTreeWidgetItemオブジェクト自体は)とても例えばitem = {'Item12': {'ItemEnabled': True}}

のようなdictのは、容易になるだろう不適切である。 'QTreeWidgetItem'の値をキーとして使う方が簡単なので、' item = {'Item12':{'ItemEnabled':True}} 'のようなdictがあります。 また、このキーは 'Qt.DisplayRole'の代わりに' Qt.UserRole'を使用して保存することができます –

+0

これは私が使用している辞書の非常に単純化されたバージョンです。記録します。 –

答えて

0

QTreeWidgetItemがチェックされているかチェックされていないと、QTreeWidget.itemChanged(item, column)シグナルが発行されます。だからあなたはそれを使用し、あなたのitemスロットのdictを更新することができます。

コメントによると、itemの使用法は不適切です。

from PyQt4 import QtCore, QtGui 
import sys 


class MyApplication(QtGui.QMainWindow): 
    def __init__(self): 
     super(MyApplication, self).__init__() 
     self.item = {'Item12': {'ItemEnabled': True}} 
     self.setupUi() 

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

     for key, value in TreeList.items(): 
      parent = QtGui.QTreeWidgetItem(self.treeWidget, [key]) 
      for val in value: 
       child = QtGui.QTreeWidgetItem([val]) 
       child.setFlags(child.flags() | QtCore.Qt.ItemIsUserCheckable) 
       child.setCheckState(0, QtCore.Qt.Checked if val in self.item else QtCore.Qt.Unchecked) 
       parent.addChild(child) 

     self.treeWidget.itemChanged.connect(self.treeWidgetItemChanged) 

    def setupUi(self): 
     self.centralwidget = QtGui.QWidget(self) 
     self.gridLayout = QtGui.QGridLayout(self.centralwidget) 
     self.treeWidget = QtGui.QTreeWidget(self.centralwidget) 
     self.gridLayout.addWidget(self.treeWidget) 
     self.setCentralWidget(self.centralwidget) 

    def treeWidgetItemChanged(self, widgetItem, column): 
     print("Item {} is checked: {}".format(widgetItem, widgetItem.checkState(column) == QtCore.Qt.Checked)) 
     itemName = str(widgetItem.text(column)) 
     try: 
      self.item[itemName]['ItemEnabled'] = widgetItem.checkState(column) == QtCore.Qt.Checked 
     except KeyError: 
      self.item[itemName] = {'ItemEnabled': widgetItem.checkState(column) == QtCore.Qt.Checked} 

     print(self.item) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    w = MyApplication() 
    w.show() 
    sys.exit(app.exec_()) 
+0

これは、ユーザーがチェックボックスをチェックしたりチェックを外したときの問題を解決しますが、 'item = {} 'ディクショナリから読み込んでQTreeViewのチェックボックスに' ItemEnabled'値を適用するとどうなりますか?私はPyQt5とPython 3を使用していますので、答えを修正する必要がありました。 –

+0

これもやっている(私は何度も私の答えを編集した:p)。私はPyQt5をインストールしていないが、それは多くの努力なしで動作すると思う。 –

+0

これはうまくいきますが、それでも私が望んでいたコントロールを実際に私に与えることはありません。 'self.treeWidget.itemChanged.connect(self.treeWidgetItemChanged)'を使わずに 'treeWidgetItemChanged'を呼び出す方法はありますか?私が尋ねる理由は、私の場合、 'self.treeWidget'が' self.item'の前にインスタンス化されているからです。 'widgetItem'は' self.treeWidget'から渡されたオブジェクトなので、答えはノーと仮定します。私はその部分のために新しい質問が必要かもしれません。 –

関連する問題