0

我有一个 customQTableView和一个 custom 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方法来实现我的目标,但我想知道为什么上面的代码会失败。

4

1 回答 1

0

好的,我想我明白了。认为默认委托使用返回的值data来呈现表格单元格。根据文档

通过为每个角色提供适当的项目数据,模型可以向视图和委托提供关于项目应如何呈现给用户的提示。不同类型的视图可以根据需要自由解释或忽略此信息。

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

于 2013-01-26T07:42:41.437 回答