Check/Uncheck 个选定的树视图项
Check/Uncheck selected treeview items
我怎样才能做到这一点,当用户单击所选项目中的复选框时,它会更改树视图中所有 selected 项目以匹配单击复选框的状态?单击的项目。
例如,当我单击 Jason 时,它应该切换选中的所有其他项目也被选中。然而,当前发生的是 Jason 成为唯一选择和检查的项目。
点击杰森之前:
当前点击 Jason 后的结果:
我希望发生的事情:
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()
第一步是连接到项目状态更改时发出的信号。
这可以通过以下方式实现:
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" 按钮来避免这种情况。我不知道作为程序员,您是否以及如何可以覆盖此标准行为。
我怎样才能做到这一点,当用户单击所选项目中的复选框时,它会更改树视图中所有 selected 项目以匹配单击复选框的状态?单击的项目。
例如,当我单击 Jason 时,它应该切换选中的所有其他项目也被选中。然而,当前发生的是 Jason 成为唯一选择和检查的项目。
点击杰森之前:
当前点击 Jason 后的结果:
我希望发生的事情:
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()
第一步是连接到项目状态更改时发出的信号。
这可以通过以下方式实现:
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" 按钮来避免这种情况。我不知道作为程序员,您是否以及如何可以覆盖此标准行为。