使用QStandardItemModel更改QTableView的行颜色

时间:2013-10-29 11:42:54

标签: python pyqt qtableview

我有一个分配给QTableView的QStandardItemModel 我想根据模型的第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 个答案:

答案 0 :(得分: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))

解决了这个问题。