如何为应用程序范围内的QPlainTextEdit设置字体

时间:2016-12-03 17:00:38

标签: python qt fonts pyqt pyside

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

我目前的工作人员感到非常苛刻。我已经覆盖了QPlainTextEdit,将该子类命名为CodeEditWidget并且有这个黑客:

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(带有QtWidgets的relpaced QtGui)对其进行了相同的测试,并且按预期工作。那么它是PyQt5中的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

我可以在PyQt-5.7中确认这种行为。

这似乎是一个错误,因为http://www.w3schools.com/jsref/event_onmouseover.asp(PyQt5_gpl-5.7.1.dev1611251257)中没有出现同样的问题。因此,在PyQt-5.7.1发布之前,您似乎必须使用当前的解决方法。