代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

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

  •  0
  • JokerMartini  · 技术社区  · 6 年前

    如果用户单击选中项目中的复选框,它将更改树视图中的所有 selected items以匹配单击的复选框的状态,我如何才能做到这一点?单击的项目。

    例如,当我单击Jason时,它应该将所有其他选中的项都切换为选中状态。然而,现在发生的情况是,Jason成为唯一被选中和选中的项目。

    单击Jason之前:

    单击jason后的当前结果:

    我想发生什么:

    导入系统 导入操作系统 从Pyside导入qtgui,qtcore 类示例(qtgui.qdialog): 定义初始化(self,parent=none): super(示例,self)。初始化(父级) 自我调整大小(300,300) self.setWindowTitle(“示例”) self.ui_items=qtgui.qtreeview()。 self.ui_items.sortByColumn(1,qtcore.qt.ascendingorder) self.ui_items.setEditTriggers(qtgui.qabstratemView.noEditTriggers) self.ui_items.setSelectionBehavior(qtgui.qabstratemView.selectRows) self.ui_items.setSelectionMode(qtgui.qabstratemView.extendedSelection) self.ui_items.setModel(qtgui.qStandardItemModel()) 网格=qtgui.qgridlayout() grid.setContentsMargins(0、0、0、0) grid.addwidget(self.ui_项,0,0) 自设置布局(网格) 自设置布局(网格) self.create_模型() def创建\模型(self): model=self.ui_items.model()。 模型,清除() model.setHorizontalHeaderLabels([“items”]) self.ui_items.sortByColumn(0,qtcore.qt.ascendingorder) 数据={ 'family 01':['amy'、'kevin'], 'Family 02':['Sarah'、'Jason'、'Abby'], 'Family 03':['Michelle'、'Mike'、'Scott'、'Allie'] } 对于data.items()中的k、v: 根= 阿氏家族 根节点=qtgui.qstandarditem() 根节点.setdata(k,role=qtcore.qt.displayRole) root.append(根节点) 儿童 儿童在V: 行= [ ] row_node=qtgui.qStandardItem()。 row_node.setdata(子级,角色=qtcore.qt.displayRole) row_node.setcheckable(真) row.append(行节点) 根节点.appendrow(row) model.appendrow(根) self.ui_items.expandall()。 self.ui_items.resizeColumnContents(0) DEF主体(): app=qtgui.qapplication(系统argv) EX=示例() 显示() 系统退出(app.exec_u()) 如果“名称”= 主体() < /代码> <是否签入已单击复选框的状态?单击的项。

    例如,当我单击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 回复  |  直到 6 年前
        1
  •  0
  •   Frank from Frankfurt    6 年前

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

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

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

    这些行必须插入到 SET模型() 命令。 处理状态更改 必须定义的方法的名称:

    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”按钮来避免这种行为。我不知道作为一个程序员,您是否可以以及如何重写这个标准行为。