如何为QplaintExtedIt范围应用程序设置字体



在我的应用程序中,我可能有多个QPlainTextEdit小部件。我还为此小部件具有全局字体设置,当我在全局设置中更改此字体时,我希望新字体自动传播到我的应用程序中所有现有的QPlainTextEdit实例。我可能需要使用QApplication.setFont(font, "QPlainTextEdit"),但这似乎适用于其他类型的小部件,但对QPlainTextEdit不起作用。

我目前的Workarund感觉很刺眼。我已经覆盖了QPlainTextEdit,命名为该子类CodeEditWidget,并具有此hack:

def event(self, event):
    if event.type()  == QtCore.QEvent.ApplicationFontChange:
        self.setFont(Settings.codeFont)  # I need to keep the font in some global place
    return super(CodeEditWidget, self).event(event)

好吧,它有效,但我不太喜欢它。当然,我希望自动传播它。如果不可能,我宁愿不必保留它并通过某些全球设置将其传递。那可能吗?我如何以标准方式将字体设置在此event()函数中?

更新:我将问题范围缩小到此片段:

import sys
from PyQt5 import QtGui, QtWidgets
class MyText(QtWidgets.QPlainTextEdit):
    pass
class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        text1 = QtWidgets.QPlainTextEdit()
        text1.setPlainText("AAA")
        text2 = MyText()
        text2.setPlainText("AAA")
        button = QtWidgets.QPushButton("Push to change font")
        button.clicked.connect(self.onButtonClicked)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(text1)
        layout.addWidget(text2)
        layout.addWidget(button)
    def onButtonClicked(self):
        font = QtGui.QFont("Courier", 20)
        # QtWidgets.QApplication.setFont(font, "QPlainTextEdit")
        QtWidgets.QApplication.setFont(font, "MyText")
app = QtWidgets.QApplication(sys.argv)
mainWindow = MyWidget()
mainWindow.show()
result = app.exec_()
sys.exit(result)

虽然评论输出线将更改两个编辑框的字体,但使用setFont(font, "MyText")的行将无助。

PyQt5中似乎存在此问题。在另一侧,我用PySidePyQt4(与QtGuiQtWidgets)一起测试了相同的测试,并且可以按预期工作。因此,这要么是PyQt5中的错误,要么我做错了什么?

我可以在pyqt-5.7中确认此行为。

这似乎是一个错误,因为在最新开发快照(PYQT5_GPL-5.7.1.dev1611251257)中没有出现相同的问题。因此,似乎您必须使用当前的工作障碍,直到发布Pyqt-5.7.1。

相关内容