使用 QStandardItemModel 更改 QTableView 的行颜色

Posted

技术标签:

【中文标题】使用 QStandardItemModel 更改 QTableView 的行颜色【英文标题】:Change row color of a QTableView with QStandardItemModel 【发布时间】:2013-10-29 11:42:54 【问题描述】:

我有一个 QStandardItemModel 分配给一个 QTableView 我想根据模型第5列的值来改变每一行的颜色:

class MyStandardTableModel(QtGui.QStandardItemModel):
    def __init__(self, headerdata, parent=None, *args):
        QtGui.QStandardItemModel.__init__(self, parent, *args)
        self.headerdata = headerdata

    def data(self, index, role):
        if not index.isValid():
            return QtCore.QVariant()
        elif role != QtCore.Qt.DisplayRole:
            if role == QtCore.Qt.TextAlignmentRole:
                return QtCore.Qt.AlignHCenter
            if role == QtCore.Qt.BackgroundRole:
                status = index.sibling(index.row(), 5).data().toInt()[0]
                if status == 1:
                    return QtCore.QVariant(QtGui.QColor(QtCore.Qt.green))
                if status == 2:
                    return QtCore.QVariant(QtGui.QColor(QtCore.Qt.red))
        return QtGui.QStandardItemModel.data(self, index, role)

...

以及更改颜色的功能(仅用于测试的第 1 行和第 2 行):

def changeColor(self, model):
    model.setData(model.index(1, 5), 1)
    model.setData(model.index(2, 5), 2)

目前,当我调用 changeColor 函数时,行不会立即改变,但当我调用函数并滚动 QTableView 时会改变。

我想我必须在changeColor 中发出一个信号,但我不知道是哪个。 另外,也许它有适当的方法来做到这一点。

【问题讨论】:

【参考方案1】:

好的,找到解决办法了。

要发出的信号是dataChanged(QModelIndex,QModelIndex)。我以为它是由setData 函数发出的,但实际上不是。

通过以下方式更改changeColor 函数:

def changeColor(self, model):
    model.setData(model.index(1, 5), 1)
    model.setData(model.index(2, 5), 2)
    model.emit(QtCore.SIGNAL('dataChanged(QModelIndex,QModelIndex)'), model.index(1, 5), model.index(2, 5))

解决问题。

【讨论】:

以上是关于使用 QStandardItemModel 更改 QTableView 的行颜色的主要内容,如果未能解决你的问题,请参考以下文章

Qt中QStandardItemModel中的重复行

如何调整 QTreeView 和 QStandardItemModel 中的行大小?

如何使用qstandarditemmodel获取qtableview中的数据

关于QStandardItemModel

在 qt 中使用 QStandardItemModel 显示 QSQLite 数据库 [关闭]

如何从函数传递 QStandardItemModel?