<p>据我所知,实际上有两种方法</p>
<p><strong>第一个就像Oleg说的,使用委托</strong>,但是我的实现有点愚蠢,这里是pesudo代码</p>
<pre><code>self.table = QTableView()
self.model = QStandItemModel()
self.table.setMode(model)
self.table.pressed.connect(self.detectWord)
def detectWord(self):
self.to_color = []
for row in range(self.model.rowCount()):
for column in range(self.model.colunCount()):
raw = self.model.data(self.model.index(row, column), Qt.DisplayRole)
# needs decode, it's QString/utf-16 by default
if 'word' in codecs.decode(raw.toString(), 'utf-16'):
self.to_color.append([row, column])
# apply delegate
self.table.setItemDelegate(ColorColumn(self.to_color, self)
class ColorColumn(QItemDelegate):
def __init__(self, to_color, parent = None):
self.to_color = to_color
def paint(self, painter, option, index):
masked = False
for pos in self.to_delete:
if index.row() == pos[0] and index.column == pos[1]:
text = index.model().data(index).toString()
palette = QApplication.palette()
document = QTextDocument()
document.setDefaultFont(option.font)
document.setPlainText(text)
painter.save()
palette.fillRect(option.rect, QColor(255, 255, 0, 50))
document.drawContent(painter)
painter.restore()
masked = True
if not masked:
QItemDelegate.paint(self, paint, option, index)
</code></pre>
<p>但这会以某种方式一遍又一遍地扫描整个数据,有潜在的性能问题</p>
<p><strong>第二个更标准,使用QAbstractTableModel</strong>,参见<a href="https://stackoverflow.com/questions/13925905/how-to-change-background-color-after-editing-qtableview-cell">shuman's answer</a></p>
<p>基本上做以下事情</p>
<ol>
<li><p>创建一个类来表示一个数据项(继承对象)</p>
<p>此外,def contain(self,column,to_color_word)表示是否应该对其着色</p></li>
<li><p>创建一个表示表的模型(继承QAbstractTableModel)</p>
<p>和他一样,在数据(self,index,role)中,也就是“read”或model,在backgroundrole中,使用您在上面定义的方法来表示颜色</p></li>
<li><p>要在顶层组合的setModel</p></li>
</ol>
<p>这比使用QstandardItem更合适</p>