我有一个分配给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
发出信号,但我不知道是哪一个。
此外,也许它有一个正确的方法来做到这一点。
答案 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))
解决了这个问题。