QTableView 中的着色行而不是单元格
Posted
技术标签:
【中文标题】QTableView 中的着色行而不是单元格【英文标题】:Coloring Row in QTableView instead of Cell 【发布时间】: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 值,随机排列,因此它显示为布尔列。
【参考方案1】:
如果布尔值的列是已知的,您只需在索引的给定行检查该列的值。 假设列索引为2:
class PandasModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
self._data = data
self.boolColumn = 2
# ...
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()
if self._data.iloc[row, self.boolColumn] == True:
return QtGui.QColor('yellow')
注意:return None
隐含在功能块的末尾,不需要指定。
【讨论】:
史诗,是的,将特定于布尔列的列设置为完全有效。谢谢!你的直觉不错,列索引是2。以上是关于QTableView 中的着色行而不是单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何为每个 QTableView 单元格支持两个单独的可双击值?
如何自定义 Material ui 表格单元格,以便其中的文本将占用两行而不是一行?