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

PyQt5中为表格多列单元格按百分比值设置背景渐变的问题

PyQt5中为表格多列单元格按百分比值设置背景渐变的问题

嘿,我仔细看了你的代码,发现只有第0列能正常显示渐变的原因很明确——第1列的渐变方向没和你的预期逻辑匹配,导致颜色过渡效果没正确呈现,咱们来调整一下就能解决问题:

问题根源

你原本想让第1列的渐变反向(从右到左),但代码里所有列都用了相同的从左到右渐变起点QtCore.QPointF(0, 0)到终点QtCore.QPointF(1, 0),只是改了颜色stop的位置,这就导致颜色过渡逻辑和渐变方向冲突,看起来就像没生效一样。

修复后的完整代码

import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QVBoxLayout

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self._data)

    def columnCount(self, parent=QtCore.QModelIndex()):
        return len(self._data[0]) if self.rowCount() > 0 else 0

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.BackgroundRole:
            row = index.row()
            col = index.column()
            if 0 <= row < self.rowCount() and 0 <= col < self.columnCount():
                percent = self._data[row][col]
                
                # 为不同列单独创建对应方向的渐变
                if col == 0:
                    gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(1, 0))
                    gradient.setColorAt(0, Qt.red)
                    gradient.setColorAt(percent, Qt.white)
                elif col == 1:
                    # 第1列使用反向渐变:从右到左
                    gradient = QtGui.QLinearGradient(QtCore.QPointF(1, 0), QtCore.QPointF(0, 0))
                    gradient.setColorAt(0, Qt.blue)
                    gradient.setColorAt(percent, Qt.white)
                elif col == 2:
                    gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(1, 0))
                    gradient.setColorAt(0, Qt.green)
                    gradient.setColorAt(percent, Qt.white)
                
                gradient.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode)
                return QtGui.QBrush(gradient)
        elif role == Qt.DisplayRole:
            row = index.row()
            col = index.column()
            if 0 <= row < self.rowCount() and 0 <= col < self.columnCount():
                percent = self._data[row][col]
                return '{:.0%}'.format(percent)  # 格式化为百分比文本
        return QtCore.QVariant()

def main():
    app = QApplication(sys.argv)
    data = [
        [0.4, 0.5, 0.8],
        [0.3, 0.6, 0.9],
        [0.9, 0.7, 1.0],
        [0.9, 0.7, 1.0]
    ]
    widget = QWidget()
    layout = QVBoxLayout(widget)
    table = QTableView(widget)
    model = TableModel(data)
    table.setModel(model)
    layout.addWidget(table)
    widget.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

关键修改点

  1. 为第1列单独设置反向渐变方向:把第1列的渐变起点和终点改成(1, 0)到(0, 0),实现从右到左的过渡效果
  2. 统一渐变逻辑:每个列单独创建渐变对象,让方向和颜色stop的对应关系更清晰,避免冲突
  3. 保持原有需求:第0、2列维持从左到右的渐变,值越大彩色覆盖范围越宽;第1列反向,值越大蓝色覆盖范围越宽

这样修改后,三列就能正常显示各自的渐变效果啦!

备注:内容来源于stack exchange,提问作者Kankan2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:59:32