选中/取消选中选定的树形视图项目

时间:2018-09-10 17:21:16

标签: python pyside qtreeview

当用户单击所选项目中的复选框时,如何更改树视图中所有所选项目以匹配单击复选框的状态?被点击的项目。

例如,当我单击Jason时,它应该切换所有其他要检查的项目。但是,当前发生的是Jason成为唯一被选中和检查的项目。

在点击Jason之前:

enter image description here

单击Jason后的当前结果:

enter image description here

我想发生的事情:

enter image description here

import sys
import os
from PySide import QtGui, QtCore


class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.resize(300, 300)
        self.setWindowTitle('Example')

        self.ui_items = QtGui.QTreeView()
        self.ui_items.sortByColumn(1, QtCore.Qt.AscendingOrder)
        self.ui_items.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.ui_items.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.ui_items.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.ui_items.setModel(QtGui.QStandardItemModel())

        grid = QtGui.QGridLayout()
        grid.setContentsMargins(0, 0, 0, 0)
        grid.addWidget(self.ui_items, 0, 0)
        self.setLayout(grid)
        self.setLayout(grid)

        self.create_model()


    def create_model(self):
        model = self.ui_items.model()
        model.clear()
        model.setHorizontalHeaderLabels(['Items'])
        self.ui_items.sortByColumn(0, QtCore.Qt.AscendingOrder)

        data = {
            'Family 01': ['Amy', 'Kevin'],
            'Family 02': ['Sarah', 'Jason', 'Abby'],
            'Family 03': ['Michelle', 'Mike', 'Scott', 'Allie']
        }

        for k, v in data.items():
            root = []

            # family
            root_node = QtGui.QStandardItem()
            root_node.setData(k, role=QtCore.Qt.DisplayRole)
            root.append(root_node)

            # children
            for child in v:

                row = []
                row_node = QtGui.QStandardItem()
                row_node.setData(child, role=QtCore.Qt.DisplayRole)
                row_node.setCheckable(True)
                row.append(row_node)
                root_node.appendRow(row)

            model.appendRow(root)

        self.ui_items.expandAll()
        self.ui_items.resizeColumnToContents(0)


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

第一步是连接到项目状态更改时发出的信号。

这可以通过以下方式实现:

model = self.ui_items.model()
model.itemChanged.connect(self.handle_statechange)

这些行必须在 setModel()命令之后的某个位置插入。 handle_statechange 是您必须定义的方法的名称:

def handle_statechange(self, checked_item):
    state = checked_item.checkState()
    indices = self.ui_items.selectedIndexes()
    for idx in indices:
        item = idx.model().itemFromIndex(idx)
        item.setCheckState(state)

编辑: Eyllanesc评论说,单击复选框会取消选择除带有单击复选框的项目以外的所有项目。这是正常的行为,作为用户,您可以通过单击“ Ctrl”按钮来避免这种行为。我不知道您是否可以以及如何以程序员的身份来覆盖这种标准行为。