如何设置QTreeWidget子项的子项的setCheckedState?

时间:2017-12-09 17:13:31

标签: python python-3.x pyqt pyqt5 qtreewidget

我有一个QTreeWidget,它有一个隐藏的根,2个孩子作为标题,2个孩子在这些孩子下面。

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)

使用item = {}词典中的变量,我需要{HEIDER 1,ITEM 12的setCheckState。目前我使用self.CurrentIndexLabel跟踪当前选定的标签,尽管这可能与此无关例。我已经填充了这样的树:

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 = {}字典来设置项目是否已选中或取消选中,当用户取消选中该项目时,我需要更改{{1} }字典来反映项目是否已启用。

我假设我需要使用信号和插槽来检测更改,但我似乎无法弄清楚如何将列表中的项目标记为已选中,并且我不确定如何反映用户检查或取消选中item = {}中的项目。

如果我可以使用1和0跟踪检查或取消选中以使用当前状态更新字典TreeList,那将是理想的。

实现这一目标的最佳方法是什么?我是python的新手,所以请耐心等待。我正在使用Python 3.6和PyQt5

1 个答案:

答案 0 :(得分:0)

选中或取消选中QTreeWidgetItem时,会发出QTreeWidget.itemChanged(item, column)信号。因此,您可以使用它,然后更新插槽中的item dict。

正如评论中所说,我认为你使用的item字典的结构是不恰当的。使用QTreeWidgetItem文本值作为键(或者更好的是,QTreeWidgetItem对象本身)会更容易,所以像item = {'Item12': {'ItemEnabled': True}}

这样的词典

例如:

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_())