QTableView使用PandasModel时如何为含True值的整行着色而非单单元格
解决方案
你的问题出在BackgroundRole的判断逻辑只校验了当前正在渲染的单元格的取值,只要调整判断逻辑为校验当前行指定列的取值即可实现整行着色,同时不会覆盖原有交替行颜色效果。
修改后的代码示例
class PandasModel(QtCore.QAbstractTableModel): def __init__(self, data, parent=None): QtCore.QAbstractTableModel.__init__(self, parent) self._data = data # 在这里定义你要判断是否包含True的目标列,两种方式二选一: # 方式1:直接写列索引(从0开始计数) self.TARGET_COL = 2 # 方式2:用列名获取索引,更稳妥不怕列顺序变动 # self.TARGET_COL = self._data.columns.get_loc("你要判断的列名") def rowCount(self, parent=None): return len(self._data.values) def columnCount(self, parent=None): return self._data.columns.size def data(self, index, role=QtCore.Qt.DisplayRole): if index.isValid(): if role == QtCore.Qt.DisplayRole: return str(self._data.values[index.row()][index.column()]) if role == QtCore.Qt.BackgroundRole: row = index.row() # 不管当前渲染的是哪一列,都判断当前行的目标列是否为True if self._data.iloc[row, self.TARGET_COL] == True: return QtGui.QColor('yellow') # 不满足条件直接返回None,自动沿用你设置的交替行颜色 return None def headerData(self, col, orientation, role): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return self._data.columns[col] return None
逻辑说明
- 原代码判断的是
self._data.iloc[row,col],其中col是当前被渲染单元格的列索引,所以只有值为True的单个单元格会变色 - 修改后判断的是固定的
self.TARGET_COL列的取值,只要该行该列值为True,该行所有单元格的BackgroundRole都会返回黄色,实现整行着色 - 不符合着色条件的行
BackgroundRole返回None,QTableView会自动应用你提前设置的交替行颜色,无需额外适配
内容的提问来源于stack exchange,提问作者pipettejockey
相关产品推荐
相关产品推荐

