在Pyqt的qtable中更改选定字符串的颜色
我刚开始学习PyQt编程,正在用qt4设计一个图形界面(GUI)。在这个界面里,有一个表格,当我点击一个按钮时,表格会被填充数据。这个界面看起来像下面这张图片:
现在我想把表格中“状态”这一列的字符串上色,比如“checked”这个字符串变成绿色,而“not_checked”这个字符串变成红色。
我该怎么做呢?我可以用样式表来实现吗?请帮帮我。
1 个回答
1
我建议你使用 QtGui.QItemDelegate
来显示你的数据。这个方法也适用于 QTableWidget
和 QTableView
。你需要在 QItemDelegate.paint (self, QPainter painter, QStyleOptionViewItem option, QModelIndex index)
这个方法里实现。
在这个方法中,如果你想要在自定义的字段(比如说第二列)中使用特定的颜色来绘制,就在这里进行绘制。完成你的自定义 QtGui.QItemDelegate
后,可以通过 QAbstractItemView.setItemDelegate (self, QAbstractItemDelegate delegate)
把它放到你的 QTableWidget
或 QTableView
中。
示例:
import sys
from PyQt4 import QtGui, QtCore
class ENUM_STATUS:
CHECKED = QtCore.QString('checked')
NOT_CHECKED = QtCore.QString('not_checked')
class QCustomDelegate (QtGui.QItemDelegate):
def paint (self, painterQPainter, optionQStyleOptionViewItem, indexQModelIndex):
column = indexQModelIndex.column()
if column == 1:
textQString = indexQModelIndex.model().data(indexQModelIndex, QtCore.Qt.EditRole).toString()
if textQString == ENUM_STATUS.CHECKED:
currentQColor = QtCore.Qt.darkGreen
elif textQString == ENUM_STATUS.NOT_CHECKED:
currentQColor = QtCore.Qt.darkRed
else:
currentQColor = QtCore.Qt.darkGray
painterQPainter.setPen(currentQColor)
painterQPainter.drawText(optionQStyleOptionViewItem.rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, textQString)
else:
QtGui.QItemDelegate.paint(self, painterQPainter, optionQStyleOptionViewItem, indexQModelIndex)
class QCustomTableWidget (QtGui.QTableWidget):
def __init__ (self, parent = None):
super(QCustomTableWidget, self).__init__(parent)
### <! This is initiate your QTableWidget or QTableView, Your code >! ###
listsHorizontalHeaderItem = ['Name', 'Status']
self.setColumnCount(len(listsHorizontalHeaderItem))
for index in range(self.columnCount()):
self.setHorizontalHeaderItem(index, QtGui.QTableWidgetItem(listsHorizontalHeaderItem[index]))
listsData = [
['Mr. A', ENUM_STATUS.CHECKED],
['Mr. B', ENUM_STATUS.NOT_CHECKED],
['Mr. C', ENUM_STATUS.NOT_CHECKED],
['Mr. D', ENUM_STATUS.CHECKED],
['Mr. E', ENUM_STATUS.CHECKED]]
self.setRowCount(len(listsData))
for row in range(len(listsData)):
for column in range(len(listsData[row])):
self.setItem(row, column, QtGui.QTableWidgetItem(listsData[row][column]))
### <! End initiate >! ###
# After initiated, Your have to setup delegate to your QTableWidget or QTableView, Add line
self.myQCustomDelegate = QCustomDelegate()
self.setItemDelegate(self.myQCustomDelegate)
if __name__ == '__main__':
myQApplication = QtGui.QApplication(sys.argv)
myQCustomTableWidget = QCustomTableWidget()
myQCustomTableWidget.show()
sys.exit(myQApplication.exec_())