在 PyQt5 中用 ItemDelegate QTextEdit 替换默认编辑器后更改 QTableView 的字体颜色

Changing the font color of a QTableView after replacing the default editor with an ItemDelegate QTextEdit in PyQt5

我目前正在尝试向 PandasGUI 应用程序添加多行文本编辑器,并已实施此处找到的解决方案:

我正在为应用程序使用 qtstylish.dark() 样式表,因此我希望 QTableview 的文本为白色。目前是黑色,一直坚决抵制我改文字颜色的努力

重新实现的绘画功能目前如下所示:

def paint(self, painter, option, index):
    # Remove dotted border on cell focus.  
    if option.state & QtWidgets.QStyle.State_HasFocus:
        option.state = option.state ^ QtWidgets.QStyle.State_HasFocus
    
    self.initStyleOption(option, index)
    painter.save()
    doc = QtGui.QTextDocument()
    doc.setDocumentMargin(2)
    doc.setTextWidth(option.rect.width())
    doc.setHtml(option.text)
    option.text = ""
    option.widget.style().drawControl(
        QtWidgets.QStyle.CE_ItemViewItem, option, painter)
    painter.translate(option.rect.left(), option.rect.top())
    doc.drawContents(painter)
    painter.restore()

我尝试添加到函数中的一些东西:

painter.setPen(QColor(255, 255, 255, 200))
painter.setPen(QtGui.QPen(QtCore.Qt.white))
option.palette.setColor(QPalette.Normal, QPalette.Foreground, Qt.white)
doc.setDefaultStyleSheet('color: rgb(255, 255, 255);')

我也尝试过重新实现 drawContents 和 initStyleOption 函数,但未能成功更改字体颜色。

默认情况下,QTextDocument 使用全局应用程序调色板(可能会被样式表覆盖)。

如果小部件使用不同的调色板,那么 QTextDocument.drawContents() 是不够的,必须使用适当的上下文。

解决方案是将 document layout and create a PaintContext 实例与备用调色板一起使用:

    def paint(self, painter, option, index):
        # ...
        layout = doc.documentLayout()
        ctx = layout.PaintContext()
        ctx.palette = option.palette
        layout.draw(painter, ctx)
        painter.restore()

注意:您可能需要 setClipRect() 画家将绘图限制在索引矩形内,否则您可能会出现一些绘图瑕疵(尤其是在悬停和滚动时)。我无法测试您的代码,但以下内容应该足够了:

        # after translation
        clip = QtCore.QRectF(0, 0, 
            option.rect.width(), option.rect.height())
        painter.setClipRect(clip)