请教一下:
如何在QTableWidget的表头中,自定义的为某一列插入一个复选框?
通过重写QHeaderView的paintSection方法我尝试了,我技术还不到家,没成功。
QTableWidget表头插入组件的问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 普通网友 2023-09-11 20:12关注
可以通过继承QHeaderView并重写其paintSection方法来实现在表头中插入复选框。
以下是一个简单的示例代码,演示如何在第二列头中插入一个复选框。
from PyQt5.QtCore import Qt from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QHeaderView, QTableWidget, QTableWidgetItem, QWidget, QCheckBox, QApplication class CheckBoxHeader(QHeaderView): clicked = None def __init__(self, parent=None): super(CheckBoxHeader, self).__init__(Qt.Horizontal, parent) self._checkbox = QCheckBox(self) self._checkbox.clicked.connect(self._on_checkbox_clicked) def _on_checkbox_clicked(self, checked): if self.clicked: self.clicked(checked) def paintSection(self, painter, rect, logicalIndex): painter.save() super(CheckBoxHeader, self).paintSection(painter, rect, logicalIndex) if logicalIndex == 1: self._checkbox.setGeometry(rect.x() + 4, rect.y() + 4, rect.width() - 8, rect.height() - 8) self._checkbox.show() else: self._checkbox.hide() painter.restore() if __name__ == '__main__': app = QApplication([]) w = QTableWidget() w.setColumnCount(3) w.setHorizontalHeaderLabels(['Name', 'Age', 'Gender']) w.setRowCount(2) w.setItem(0, 0, QTableWidgetItem('Alice')) w.setItem(0, 1, QTableWidgetItem('20')) w.setItem(0, 2, QTableWidgetItem('Female')) w.setItem(1, 0, QTableWidgetItem('Bob')) w.setItem(1, 1, QTableWidgetItem('25')) w.setItem(1, 2, QTableWidgetItem('Male')) header = CheckBoxHeader(w) header.setSectionResizeMode(0, QHeaderView.Stretch) header.clicked.connect(lambda checked: print('Checkbox clicked:', checked)) w.setHorizontalHeader(header) w.show() app.exec_()在这个示例中,继承了QHeaderView并重写了paintSection方法。在paintSection方法中,首先调用了父类的paintSection方法,然后判断该列是否是第二列头。如果是,就将复选框插入该列头。否则,隐藏复选框。
在主程序中,创建了一个QTableWidget,并在第二列中插入了复选框。当复选框被点击时,会触发header的clicked信号,可以在该信号的槽函数中进行相应的处理。
评论 打赏 举报解决 1无用