在 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)
我目前正在尝试向 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)