我有自定义QTableView
和自定义QAbstractTableModel
。视图仅允许单个选择。我试图在某些条件下自定义所选单元格的背景颜色,但没有成功。我希望通过将模型的data
方法与视图的selectionChanged
方法相结合来实现。例如,假设我想在匹配给定行时更改所选单元格的颜色。我的selectionChanged
方法代码是:
def selectionChanged(self, selected, deselected):
#QtGui.QTableView.selectionChanged(self, selected, deselected)
# Get the selected indexes from the QItemSelection object
selection = selected.indexes()
# Let the model track the selected cell
self.tmodel.selected_index = selection[0]
# Desperately try to make it work
self.tmodel.dataChanged.emit(selection[0], selection[0])
self.viewport().update()
data
方法的简化代码是:
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return None
# Some code here dealing with several roles
if role == QtCore.Qt.DisplayRole:
...
elif role == QtCore.Qt.BackgroundRole:
if ((index == self.selected_index) and (index.row() == 3)):
print '++++ displaying selected'
return QtGui.QColor(QtCore.Qt.yellow)
else:
return QtGui.QColor(QtCore.Qt.green)
else:
return None
未选择的单元格具有预期的绿色背景。奇怪的是,当我在匹配行中选择一个单元格时,会打印消息++++ displaying selected
,但所选单元格具有系统默认背景而不是黄色背景。我必须遗漏一些重要/明显的东西,但我不知道它是什么。
更新
我知道我可以使用自定义委托实现我的目标并实现其paint
方法,但我想知道为什么上面的代码失败。
答案 0 :(得分:0)
data
返回的值来呈现表格单元格。相应于docs:
通过为每个角色提供适当的项目数据,模型可以提供 提示有关如何呈现项目的观点和代表 用户。不同种类的观点有自由解释或 根据需要忽略此信息。
因此,问题中描述的行为解释如下:默认委托以标准方式呈现非选定单元格,这意味着将使用data
方法返回的颜色。但是,默认委托以不同的方式呈现选定的单元格,在这种情况下,data
方法返回的值将被忽略,因为它使用系统样式提供的背景。