如何为TableView中委托自定义单元格设置选中阴影效果?
TableView整行选中时自定义列显示选中背景的解决方法
你遇到的问题是因为自定义绘制列的时候,没有处理选中状态的背景渲染——默认的QStyledItemDelegate.paint方法会自动根据选中状态绘制背景,但你自己写的列0和列2的绘制逻辑跳过了这一步,所以只有中间列显示选中阴影。
只需要修改MyDelegate的paint方法,在绘制自定义内容前先判断并绘制选中背景即可:
import sys from PyQt5.QtWidgets import QApplication, QTableView, QStyledItemDelegate, QAbstractItemView, QStyle from PyQt5.QtCore import Qt from PyQt5.QtGui import QPainter, QStandardItemModel, QStandardItem class MyTableView(QTableView): def __init__(self): super().__init__() self.model = QStandardItemModel(2, 3) self.setModel(self.model) self.model.setItem(0, 0, QStandardItem('122222')) self.model.setItem(0, 1, QStandardItem('1')) self.model.setItem(1, 1, QStandardItem('1')) self.setFocusPolicy(Qt.NoFocus) self.setSelectionBehavior(QAbstractItemView.SelectRows) self.delegate = MyDelegate() self.setItemDelegate(self.delegate) class MyDelegate(QStyledItemDelegate): def __init__(self): super().__init__() def paint(self, painter, option, index): # 先绘制选中背景(如果单元格处于选中状态) if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.highlight()) if index.column() == 0: painter.save() painter.setRenderHint(QPainter.Antialiasing, True) painter.setPen(Qt.NoPen) painter.setBrush(Qt.red) painter.drawEllipse(option.rect.center(), 10, 10) painter.restore() elif index.column() == 2: painter.save() painter.setRenderHint(QPainter.Antialiasing, True) # 选中时切换文字颜色为高亮文本色,避免看不清 pen_color = option.palette.highlightedText().color() if option.state & QStyle.State_Selected else Qt.red painter.setPen(pen_color) painter.drawText(option.rect, Qt.AlignCenter, 'hello') painter.restore() else: QStyledItemDelegate.paint(self, painter, option, index) if __name__ == "__main__": app = QApplication(sys.argv) demo = MyTableView() demo.show() sys.exit(app.exec())
关键修改说明
- 在自定义绘制内容前,先检查单元格的选中状态:通过
option.state & QStyle.State_Selected判断,若为真则用系统默认的高亮色填充单元格,保证和原生选中样式一致。 - 针对列2的文本,选中时自动切换文字颜色为系统高亮文本色,避免原红色文字在高亮背景上难以辨认,符合UI设计逻辑。
这样修改后,点击行时整行所有列都会显示选中背景,同时保留你自定义的绘制内容。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

