我需要帮助改变QTableView中一个单词的颜色。
在这里,您可以使用我的csv查看我的程序。 http://i.imgur.com/uIBQ2ch.jpg
示例:在[3] [0](4行,1列)中,我可以在我的图像中看到“filme”这个词。
这是我的完整代码:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sip
sip.setapi('QVariant', 2)
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import csv
try:
_fromUtf8 = QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s:s
class MyWindow(QWidget):
def __init__(self, fileName, parent=None):
super(MyWindow, self).__init__(parent)
self.fileName = fileName
self.model = QStandardItemModel(self)
self.tableView = QTableView(self)
self.tableView.setModel(self.model)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.pushButtonLoad = QPushButton(self)
self.pushButtonLoad.setText("Load Csv File!")
self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
self.pushButtonWrite = QPushButton(self)
self.pushButtonWrite.setText("Write Csv File!")
self.pushButtonWrite.setStyleSheet('color:red;background-color:rgb(155, 255, 153);border:1px solid purple;')
self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
self.layoutVertical = QVBoxLayout(self)
self.layoutVertical.addWidget(self.tableView)
self.layoutVertical.addWidget(self.pushButtonLoad)
self.layoutVertical.addWidget(self.pushButtonWrite)
def loadCsv(self, fileName):
with open(fileName, "rb") as fileInput:
for row in csv.reader(fileInput):
items = [
QStandardItem(field.decode('utf8'))
for field in row
]
self.model.appendRow(items)
self.tableView.resizeRowsToContents()
self.model.setHeaderData(0, Qt.Horizontal, "Feature")
self.model.setHeaderData(1, Qt.Horizontal, "Polarity(-1,0,1)")
self.model.setHeaderData(2, Qt.Horizontal, "texto")
self.tableView.setColumnWidth(2,1000)
self.tableView.resizeRowsToContents()
def writeCsv(self, fileName):
with open(fileName, "w") as fileOutput:
writer = csv.writer(fileOutput)
for rowNumber in range(self.model.rowCount()):
fields = [
self.model.data(
self.model.index(rowNumber, columnNumber),
Qt.DisplayRole
)
for columnNumber in range(self.model.columnCount())
]
writer.writerow(fields)
@pyqtSlot()
def on_pushButtonWrite_clicked(self):
self.writeCsv(self.fileName)
@pyqtSlot()
def on_pushButtonLoad_clicked(self):
self.loadCsv(self.fileName)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow("marcoteste.csv")
main.show()
sys.exit(app.exec_())
答案 0 :(得分:0)
我对Python不太了解,但这是一个想法。解决方案是为column of QTableView
使用自定义委托,并使用富文本支持实现其paint()
方法。在委托的paint()
逻辑中,在显示之前将您的关键字打包到HTML <font color="red">keyword</font>
等标记中。
您可以找到示例C ++代码here。
答案 1 :(得分:0)
实际上有两种方法,我知道
第一个就像Oleg说的那样,使用代理,但我的工具有点傻,这里是pesudo代码
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)
但这会以某种方式反复扫描整个数据,从而产生潜在的性能问题
第二个更标准,使用QAbstractTableModel ,请参阅shuman's answer
基本上做以下事情
创建一个类来表示一个数据条目(继承对象)
另外,def包含(self,column,to_color_word)以表示它应该是彩色的
创建一个表示表的模型(继承QAbstractTableModel)
就像他一样,在数据(自我,索引,角色)中,这意味着&#39;阅读&#39;或者模型,在backgroundrole,使用您在上面定义的方法来指示颜色
setModel在顶级组合
这比使用QstandardItem
更合适