在 PyQt5 中重新实现 QStyledItemDelegate 绘制函数后更改 QTableView 的字体大小

Changing the font size of a QTableView after reimplementing the QStyledItemDelegate paint function in PyQt5

我已经为 QTableView 实现了一个多行文本编辑器,如下所示:

我还没有解决的一个问题是完全控制绘制文本的样式。此处提供了字体颜色的解决方案:

我已经为 QTableView 设置了样式表:

self.setStyleSheet(
    """font-size: 14px;
    gridline-color: rgb(60, 60, 60);"""
)

它适用于设计编辑器和网格的样式。 理想情况下,我希望单元格与应用程序的其余部分具有相同的样式,同时可以通过某种方式更改某些属性,这些属性随后会影响编辑器和单元格的绘制方式。 到目前为止,我为更改字体样式所做的一切都被忽略了。我尝试过更改 initStyleOption、更改画家的字体、更改选项的字体以及我能想到的所有其他内容。

这是当前的绘画函数:

def paint(self, painter, option, index):
    """
    Method override
    """
    # 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(3)
    doc.setTextWidth(option.rect.width())
    # changed to setPlainText from setHtml because setHtml was removing all newlines
    doc.setPlainText(option.text)
    option.text = ""
    option.widget.style().drawControl(
        QtWidgets.QStyle.CE_ItemViewItem, option, painter
    )
    painter.translate(option.rect.left(), option.rect.top())

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

    layout = doc.documentLayout()
    ctx = layout.PaintContext()
    ctx.palette = option.palette
    layout.draw(painter, ctx)
    painter.restore()

当程序为 运行:

时应用应用程序范围的样式表
app = QApplication(sys.argv)
app.setStyleSheet(qtstylish.dark())

我相信编辑器和绘制单元格之间的间距也不同。

当 QTextDocument 作为独立对象创建时,它只能使用应用程序默认值,包括字体。

请注意,使用全局样式sheet,即使使用通配符选择器,也不会设置应用程序的默认字体,但仅适用于小部件,并且自 QTextDocument和 QAbstractItemDelegate 是 不是 小部件,不会应用任何样式 sheet 字体。

虽然无法访问样式sheets,但paint()函数的样式option参数可以提供这样的信息:函数的参数将是默认样式视图选项 (viewOptions()),并且 initStyleOption() 最终会改变字体,只要 FontRole returns 一个有效的 QFont。

然后解决方法是设置文档的defaultFont()

def paint(self, painter, option, index):
    # ...
    doc = QtGui.QTextDocument()
    doc.setDefaultFont(option.font)
    # ...