【发布时间】:2022-01-03 04:26:51
【问题描述】:
背景故事:使用导入的 UI,我将表格放置到 QTableView 上。我还利用交替的行颜色来更好地区分行。
问题:我希望为其中一列中包含 True 值的表的 行 着色。我可以为 单元格 着色,但还没有找到为整行着色的方法。我使用 PandasModel 类来格式化表格:
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
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()
col = index.column()
if self._data.iloc[row,col] == True:
return QtGui.QColor('yellow')
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
我浏览了许多示例,我知道可能有多种方法可以使用 QBrush 或 QColor 为表格着色,但到目前为止,我能做的最好的就是简单地为包含 True 的单元格着色价值。从其他示例中拼接代码,我认为col = index.column() 可能会妨碍您,因为它可能将其限制在单元格中,但是,当我删除它时,它变得模棱两可。
重要提示:我想保留我在脚本其他地方设置的交替行颜色,所以请记住这一点!我只想为包含任何 True 值的具体行着色。
【问题讨论】:
-
那么,如果该行的 任何 列具有
True值,那么该行应该具有特定背景?请注意,if self._data.iloc[row,col] == False: pass完全没用:删除它,您将得到完全相同的结果。 -
对,与该表关联的其他列将永远不会包含 True/False 值,因此本质上它只能引用单个列。我将从我的代码中删除
if self._data.iloc[row,col] == False: pass部分以及我的原始问题。 -
在创建模型时该布尔列是否已知?
-
是的,模型是在创建df之后创建的。有了这个想法,我尝试用
col = DF['column']替换col = index.column(),但无济于事(收到:NotImplementedError:整数类型的基于iLocation 的布尔索引不可用)。这可能是由于我是如何格式化列的,如果您希望我可以将其添加到问题中,如果您认为这可能是原因。 -
澄清一下,在打印
DF['column']时,它会返回一列 False/True 值,随机排列,因此它显示为布尔列。
标签: python-3.x pandas pyqt5