QTableView 中的着色行而不是单元格
Coloring Row in QTableView instead of Cell
背景故事: 使用导入的 UI,我将 table 放到 QTableView 上。我还利用交替的行颜色来更好地区分行。
问题: 我正在为 [=38] 的 行 上色=] 其中一列包含 True
值。我可以为 单元格 着色,但还没有找到为整行着色的方法。我使用 PandasModel class 来格式化 tables:
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 为 table 着色的方法,但到目前为止我能做的最好的就是简单地为单元格着色包含 True
值。从其他示例中拼接代码,我认为 col = index.column()
可能会妨碍,因为它可能将其限制在单元格中,但是,当我删除它时它变得模棱两可。
重要提示:我想保留我在脚本其他地方设置的交替行颜色,所以请记住这一点!我只想为包含任何 True
值的特定行着色。
如果布尔值的列是已知的,您只需在索引的给定行检查该列的值。
假设列索引为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
隐含在功能块的末尾,不需要指定。
背景故事: 使用导入的 UI,我将 table 放到 QTableView 上。我还利用交替的行颜色来更好地区分行。
问题: 我正在为 [=38] 的 行 上色=] 其中一列包含 True
值。我可以为 单元格 着色,但还没有找到为整行着色的方法。我使用 PandasModel class 来格式化 tables:
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 为 table 着色的方法,但到目前为止我能做的最好的就是简单地为单元格着色包含 True
值。从其他示例中拼接代码,我认为 col = index.column()
可能会妨碍,因为它可能将其限制在单元格中,但是,当我删除它时它变得模棱两可。
重要提示:我想保留我在脚本其他地方设置的交替行颜色,所以请记住这一点!我只想为包含任何 True
值的特定行着色。
如果布尔值的列是已知的,您只需在索引的给定行检查该列的值。
假设列索引为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
隐含在功能块的末尾,不需要指定。