问题在QTableView上呈现所选单元格

时间:2013-01-25 18:19:10

标签: pyqt4 qtableview qabstracttablemodel

我有自定义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方法,但我想知道为什么上面的代码失败。

1 个答案:

答案 0 :(得分:0)

好的,我想我明白了。我们认为默认委托使用data返回的值来呈现表格单元格。相应于docs

  

通过为每个角色提供适当的项目数据,模型可以提供   提示有关如何呈现项目的观点和代表   用户。不同种类的观点有自由解释或   根据需要忽略此信息。

因此,问题中描述的行为解释如下:默认委托以标准方式呈现非选定单元格,这意味着将使用data方法返回的颜色。但是,默认委托以不同的方式呈现选定的单元格,在这种情况下,data方法返回的值将被忽略,因为它使用系统样式提供的背景。