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, 0)到(0, 0),实现从右到左的过渡效果 - 统一渐变逻辑:每个列单独创建渐变对象,让方向和颜色stop的对应关系更清晰,避免冲突
- 保持原有需求:第0、2列维持从左到右的渐变,值越大彩色覆盖范围越宽;第1列反向,值越大蓝色覆盖范围越宽
这样修改后,三列就能正常显示各自的渐变效果啦!
备注:内容来源于stack exchange,提问作者Kankan2000
相关产品推荐
相关产品推荐

