【发布时间】:2016-02-25 06:09:21
【问题描述】:
我有一个充满可检查项目的 ListView。我想在 ListView 上方放置一个三态“全选”复选框,并且我希望这个复选框是双向的。
也就是说,如果用户切换选中所有复选框,我希望所有 ListView 的项目都反映选中所有的选择。但是,如果用户手动检查或取消选中 ListView 中的项目,我希望全选复选框反映该状态(即检查是否所有 ListView 项目都被选中,如果它们都未选中则未选中,或者如果某些 ListView项目已检查)。
This answer 显示如何连接第一部分(选中/取消选中全选框会将其状态传播到列表视图的项目)。但是,我对如何连接另一个方向感到困惑。
这就是我如何让 Check All 复选框传播到 ListView:
self.layout = QtGui.QVBoxLayout()
self.select_all_cb = QtGui.QCheckBox('Check All', self.ui.tab)
self.select_all_cb.setChecked(True)
self.select_all_cb.setStyleSheet('margin-left: 5px; font: bold')
self.select_all_cb.stateChanged.connect(self.selectAllCheckChanged)
self.layout.addWidget(select_all_cb)
self.listview = QtGui.QListView(self.ui.tab)
self.listview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
self.listview.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
self.listview.setSelectionRectVisible(False)
model = QStandardItemModel()
for checkItem in self.checkItems:
item = QStandardItem(checkItem)
item.setCheckable(True)
item.setSelectable(False)
item.setCheckState(QtCore.Qt.Checked)
model.appendRow(item)
self.listview.setModel(model)
self.layout.addWidget(listview)
def selectAllCheckChanged(self):
model = self.listview.model()
for index in range(model.rowCount()):
item = model.item(index)
if item.isCheckable():
if self.select_all_cb.isChecked():
item.setCheckState(QtCore.Qt.Checked)
else:
item.setCheckState(QtCore.Qt.Unchecked)
对如何走另一条路有什么建议吗?
【问题讨论】: