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 表格单元格,以便其中的文本将占用两行而不是一行?

单击表格单元格后,QtableView 中的某些单元格不会自动重绘

如何为 QTableView 中的单个单元格设置委托?

更改 QTableModel 中单元格的背景颜色