You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5表格问题:带内边距单元格文字不可见且背景色无法按条件变更

问题排查与修复:PyQt5彩色方格网格文字不可见及背景色不生效问题

核心问题分析

  1. 文字不可见:自定义的TableDelegate.paint方法只绘制了蓝色背景,但未调用父类的paint方法渲染单元格文本,导致文字完全没有被绘制。
  2. 背景色不按条件变化:当前Delegate硬编码固定蓝色背景,没有根据单元格数据值动态调整颜色;同时initStyleOption里的设置被自定义paint逻辑覆盖,未起到实际作用。

修复方案

  1. 恢复文本绘制:在paint方法末尾调用super().paint(painter, option, index),让父类完成文本渲染工作。
  2. 动态设置背景色:通过index获取单元格数据,根据数值条件判断并设置对应背景色,替换硬编码的蓝色。
  3. 简化冗余代码:移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:08:10