斯大淋~ 2023-09-11 20:02 采纳率: 0%
浏览 6

QTableWidget表头插入组件的问题

请教一下:
如何在QTableWidget的表头中,自定义的为某一列插入一个复选框?
通过重写QHeaderView的paintSection方法我尝试了,我技术还不到家,没成功。

  • 写回答

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信号,可以在该信号的槽函数中进行相应的处理。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月11日

悬赏问题

  • ¥15 ue2.6.12版本用的若以,安装gojs,引入import * as go from 'gojs';报错
  • ¥15 服务器上的网站安装php5.6版本
  • ¥15 ModuleNotFoundError: No module named 'torch.utils._import_utils' 是缺少什么
  • ¥15 请大咖一起探索iptv 直播源的hls通过反向代理解密
  • ¥100 寻找技术员 云闪付tn转h5输入卡号付款的链接 重酬!
  • ¥100 科大讯飞语音唤醒词,unbuntu环境,报错
  • ¥50 python写segy数据时出错2
  • ¥20 关于R studio 做精确稳定检验的问题!(语言-r语言)
  • ¥50 用贝叶斯决策方法,设计CAD程序
  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)