在我的应用程序中,我可能有多个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
中似乎存在此问题。在另一侧,我用PySide
和PyQt4
(与QtGui
的QtWidgets
)一起测试了相同的测试,并且可以按预期工作。因此,这要么是PyQt5
中的错误,要么我做错了什么?
我可以在pyqt-5.7中确认此行为。
这似乎是一个错误,因为在最新开发快照(PYQT5_GPL-5.7.1.dev1611251257)中没有出现相同的问题。因此,似乎您必须使用当前的工作障碍,直到发布Pyqt-5.7.1。