PyQt5表格问题:带内边距单元格文字不可见且背景色无法按条件变更
问题排查与修复:PyQt5彩色方格网格文字不可见及背景色不生效问题
核心问题分析
- 文字不可见:自定义的
TableDelegate.paint方法只绘制了蓝色背景,但未调用父类的paint方法渲染单元格文本,导致文字完全没有被绘制。 - 背景色不按条件变化:当前Delegate硬编码固定蓝色背景,没有根据单元格数据值动态调整颜色;同时
initStyleOption里的设置被自定义paint逻辑覆盖,未起到实际作用。
修复方案
- 恢复文本绘制:在
paint方法末尾调用super().paint(painter, option, index),让父类完成文本渲染工作。 - 动态设置背景色:通过
index获取单元格数据,根据数值条件判断并设置对应背景色,替换硬编码的蓝色。 - 简化冗余代码:移除
initStyleOption中重复的背景色设置,删除TableWidget里重复的setText操作(创建item时已完成文本设置)。
修复后的完整代码
import sys from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QStyledItemDelegate from PyQt5.QtGui import QColor from PyQt5.QtCore import Qt class TableDelegate(QStyledItemDelegate): def __init__(self, padding): super().__init__() self.padding = padding def paint(self, painter, option, index): adjusted_padding = self.padding // 2 option.rect.adjust(adjusted_padding, adjusted_padding, -adjusted_padding, -adjusted_padding) # 根据单元格数据动态设置背景色 data = index.data() if isinstance(data, float): if data < 2.0: bg_color = QColor('lightblue') else: bg_color = QColor('orange') else: bg_color = QColor('blue') # 默认颜色 painter.fillRect(option.rect, bg_color) # 调用父类paint方法绘制文本 super().paint(painter, option, index) def initStyleOption(self, option, index): super().initStyleOption(option, index) option.displayAlignment = Qt.AlignCenter | Qt.AlignVCenter class TableWidget(QTableWidget): def __init__(self, data, padding): super().__init__(len(data), len(data[0])) self.init_ui(data, padding) def init_ui(self, data, padding): self.setShowGrid(False) self.setItemDelegate(TableDelegate(padding)) cell_padding = padding * 3 for row_idx, row_data in enumerate(data): for col_idx, col_data in enumerate(row_data): item_text = str(col_data) if col_data is not None else '' item = QTableWidgetItem(item_text) self.setItem(row_idx, col_idx, item) self.setRowHeight(row_idx, cell_padding) self.setColumnWidth(col_idx, cell_padding) # 根据数据设置文本颜色 if isinstance(col_data, float) and col_data < 2.0: item.setForeground(QColor('darkblue')) else: item.setForeground(QColor('white')) item.setTextAlignment(Qt.AlignCenter) self.verticalHeader().setVisible(False) self.horizontalHeader().setVisible(False) self.cellClicked.connect(self.print_clicked_value) def print_clicked_value(self, row, col): item = self.item(row, col) if item is not None: print(item.text()) def main(): app = QApplication(sys.argv) padding = 20 data = [ [1.2, 1.02, 1.1, 1.16, 670.0], [1.1, 1.02, 1.1, 1.16, 670.0], [3, 1.02, 1.1, 1.16, 670.0], [1.01, 1.02, 1.1, 1.16, 670.0], [2.1, 1.02, 1.1, 1.16, 670.0], [1.1, 1.02, 1.1, 1.16, 670.0], [1.04, 1.02, 1.1, 1.16, 670.0], [1.89, 1.02, 1.1, 1.16, 670.0], [1.4, 1.02, 1.1, 1.16, 670.0], ] table = TableWidget(data, padding) table.setWindowTitle('Table Widget') table.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
关键修改说明
- 文本渲染恢复:在
paint方法最后添加super().paint(...),确保文本被正常绘制。 - 动态背景色:通过
index.data()获取单元格数据,根据数值范围设置不同背景色(示例中小于2.0用浅蓝,大于等于2.0用橙色)。 - 代码优化:删除冗余的重复设置,让代码逻辑更简洁清晰。
内容的提问来源于stack exchange,提问作者Kankan2000
相关产品推荐
相关产品推荐

