先看效果
具体代码如下
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
MHeaderViewStyle01 = "QHeaderView::section{height:20px;background:#d0d3dd;font:bold 12px;color:#000000;border:1px solid #c4c4c4;} \
QHeaderView::section::hover{background:#ecedee}"
MCheckBoxStyle01 = "QCheckBox{background-color:transparent;} \
QCheckBox::indicator:unchecked{image:url(://Images/btn_checkBox_unchecked.png);}\
QCheckBox::checked{color:rgb(230, 115, 0);} \
QCheckBox::indicator:checked{image:url(://Images/btn_checkBox_checked.png);}"
# 实现自定义QCheckBox
class MHeaderView(QHeaderView):
columnCheck = pyqtSignal(int, bool)
def __init__(self, CheckedColumn, parent=None):
"""
构造函数
@param CheckedColumn 带checkbox 的列序号 (int)
@param parent parent object (QTableView, QTreeView, QListView ...)
"""
super().__init__(Qt.Horizontal, parent)
self.m_bChecked = False
self.m_nAddCheckBoxColumn = CheckedColumn
self.setSectionsClickable(True)
self.sectionClicked.connect(self.onHeaderClicked)
self.setStyleSheet(MHeaderViewStyle01)
self.checkBox = QCheckBox()
self.checkBox.setStyleSheet(MCheckBoxStyle01)
def paintSection(self, pt, rect, p_int):
pt.save()
super().paintSection(pt, rect, p_int)
pt.restore()
if(p_int == self.m_nAddCheckBoxColumn):
checkBoxStyle = QStyleOptionButton()
checkBoxStyle.state = QStyle.State_On if self.m_bChecked else QStyle.State_Off
checkBoxStyle.state |= QStyle.State_Enabled
checkBoxStyle.iconSize = QSize(20, 20)
rc = QRect(rect.left() + 2,rect.top()+(rect.height()-20)/2, 20, 20)
checkBoxStyle.rect = rc
self.style().drawPrimitive(QStyle.PE_IndicatorCheckBox, checkBoxStyle, pt, self.checkBox)
@pyqtSlot(int)
def onHeaderClicked(self, nIndex):
if(0==nIndex):
self.m_bChecked = not self.m_bChecked
self.repaint()
self.columnCheck.emit(0, self.m_bChecked)
checkbox图片素材请自行下载, 如却需要,请联系,谢谢!!!