在Pyqt的qtable中更改选定字符串的颜色

2 投票
1 回答
1682 浏览
提问于 2025-04-19 23:23

我刚开始学习PyQt编程,正在用qt4设计一个图形界面(GUI)。在这个界面里,有一个表格,当我点击一个按钮时,表格会被填充数据。这个界面看起来像下面这张图片:

在这里输入图片描述

现在我想把表格中“状态”这一列的字符串上色,比如“checked”这个字符串变成绿色,而“not_checked”这个字符串变成红色。

我该怎么做呢?我可以用样式表来实现吗?请帮帮我。

1 个回答

1

我建议你使用 QtGui.QItemDelegate 来显示你的数据。这个方法也适用于 QTableWidgetQTableView。你需要在 QItemDelegate.paint (self, QPainter painter, QStyleOptionViewItem option, QModelIndex index) 这个方法里实现。

在这个方法中,如果你想要在自定义的字段(比如说第二列)中使用特定的颜色来绘制,就在这里进行绘制。完成你的自定义 QtGui.QItemDelegate 后,可以通过 QAbstractItemView.setItemDelegate (self, QAbstractItemDelegate delegate) 把它放到你的 QTableWidgetQTableView 中。

示例:

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_())

撰写回答