在QTableWidget的表头中添加一个复选框,可以实现全选功能。这可以通过继承QHeaderView并重写mousePressEvent()和paintSection()方法来实现:
class HeaderView(QtWidgets.QHeaderView):
def __init__(self, orientation, parent=None):
super(HeaderView, self).__init__(orientation, parent)
self.setClickable(True)
self.setSortIndicatorShown(False)
self._checkbox_rect = QtCore.QRect()
def paintSection(self, painter, rect, logicalIndex):
painter.save()
QtWidgets.QHeaderView.paintSection(self, painter, rect, logicalIndex)
painter.restore()
if logicalIndex == 0:
self._checkbox_rect = QtCore.QRect(rect.left()+2, rect.top()+2, 20, 20)
options = QtGui.QStyleOptionButton()
options.rect = self._checkbox_rect
options.state |= QtGui.QStyle.State_Enabled | QtGui.QStyle.State_Active
if self.isSectionSelected(logicalIndex):
options.state |= QtGui.QStyle.State_On
else:
options.state |= QtGui.QStyle.State_Off
self.style().drawControl(QtGui.QStyle.CE_CheckBox, options, painter)
def mousePressEvent(self, event):
if self._checkbox_rect.contains(event.pos()):
self.toggleSections()
else:
QtWidgets.QHeaderView.mousePressEvent(self, event)
def toggleSections(self):
check_state = not self.isSectionSelected(0)
for i in range(self.model().rowCount()):
self.setSectionSelected(i, check_state)
class Table(QtWidgets.QTableWidget):
def __init__(self, parent=None):
super(Table, self).__init__(parent)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.verticalHeader().hide()
self.setHorizontalHeader(HeaderView(QtCore.Qt.Horizontal, self))
self.setColumnCount(3)
self.setRowCount(5)
def setColumnHeaders(self, headers):
self.setHorizontalHeaderLabels(['Select'] + headers)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
table = Table()
table.setColumnHeaders(['Name', 'Age'])
for i in range(table.rowCount()):
checkbox = QtWidgets.QCheckBox()
table.setCellWidget(i, 0, checkbox)
table.show()
sys.exit(app.exec_())
这个示例将在表头中添加一个复选框,并在单击它时切换所有行的选择状态。如果要更改表头中的复选框的样式,请修改paintSection()方法中的options.rect和options.state。