如何使用 QItemDelegate 更改 QTableView 文本颜色?

Posted

技术标签:

【中文标题】如何使用 QItemDelegate 更改 QTableView 文本颜色?【英文标题】:How to change QTableView text color using QItemDelegate? 【发布时间】:2021-03-18 10:08:43 【问题描述】:

我创建了子类 QItemDelegate 并重新定义了绘制方法。我试过了

painter.setPen(QtGui.QColor('#FFFFFF'))

这不起作用。如何更改文本颜色?

作为旁注,我尝试通过调用painter.setBackground(color) 来为背景着色,但这也不起作用。这些方法打算如何使用?

class ItemDelegate(QtWidgets.QItemDelegate):
    def __init__(self, parent):
        QtWidgets.QItemDelegate.__init__(self, parent)
        self.parent = parent


    def paint(self, painter, option, index):
        item = index.data(QtCore.Qt.DisplayRole)
        #print(item)
        print(dir(painter))
        if index.column() == 1:
            color = QtGui.QColor('#34ebc6')
        elif index.column() == 2:
            color = QtGui.QColor('#FFFFFF')
        elif index.column() == 3:
            color = QtGui.QColor('#9546c7')
        else:
            color = QtGui.QColor('#FFFFFF')
        painter.fillRect(option.rect, color)
        super(ItemDelegate, self).paint(painter, option, index)

【问题讨论】:

文本颜色是从 QPalette::Text 使用的,所以你应该改变使用的调色板。 感谢您的回复。我不跟随。我在绘画功能中改变这个吗?像这样的调色板 = QtGui.QPalette() palette.setColor(QtGui.QPalette.Text, QtCore.Qt.blue)painter.setPen(palette) 【参考方案1】:

您必须重写 drawDisplay 方法,在该方法中您必须更改调色板的 QPalette::Text 和 QPalette::HighlightedText 角色的值:

class ItemDelegate(QtWidgets.QItemDelegate):
    def paint(self, painter, option, index):
        color = QtGui.QColor("#FFFFFF")
        if index.column() == 1:
            color = QtGui.QColor("#34ebc6")
        elif index.column() == 2:
            color = QtGui.QColor("#FFFFFF")
        elif index.column() == 3:
            color = QtGui.QColor("#9546c7")
        painter._color = color

        super(ItemDelegate, self).paint(painter, option, index)

    def drawDisplay(self, painter, option, rect, text):
        color = painter._color
        opt = QtWidgets.QStyleOptionViewItem(option)
        cg = (
            QtGui.QPalette.Normal
            if opt.state & QtWidgets.QStyle.State_Enabled
            else QtGui.QPalette.Disabled
        )
        if opt.state & QtWidgets.QStyle.State_Selected:
            opt.palette.setColor(cg, QtGui.QPalette.HighlightedText, color)
        opt.palette.setColor(cg, QtGui.QPalette.Text, color)
        super(ItemDelegate, self).drawDisplay(painter, opt, rect, text)

使用 QStyledItemDelegate 更容易,因为您只需要覆盖 initStyleOption 方法:

class ItemDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(ItemDelegate, self).initStyleOption(option, index)

        color = QtGui.QColor("#FFFFFF")

        if index.column() == 1:
            color = QtGui.QColor("#34ebc6")
        elif index.column() == 2:
            color = QtGui.QColor("#FFFFFF")
        elif index.column() == 3:
            color = QtGui.QColor("#9546c7")

        cg = (
            QtGui.QPalette.Normal
            if option.state & QtWidgets.QStyle.State_Enabled
            else QtGui.QPalette.Disabled
        )
        if option.state & QtWidgets.QStyle.State_Selected:
            option.palette.setColor(cg, QtGui.QPalette.HighlightedText, color)

        option.palette.setBrush(QtGui.QPalette.Text, color)

【讨论】:

以上是关于如何使用 QItemDelegate 更改 QTableView 文本颜色?的主要内容,如果未能解决你的问题,请参考以下文章

强制 QItemDelegate 重绘

强制QItemDelegate重绘

使用 QItemDelegate 显示图像缩略图

我如何知道我的 QItemDelegate 何时是列表中的最后一项?

动态控制 QItemDelegate 的大小

QItemDelegate 复选框