在我的应用程序中,我可能有多个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
中。另一方面,我使用PySide
和PyQt4
(带有QtWidgets
的relpaced QtGui
)对其进行了相同的测试,并且按预期工作。那么它是PyQt5
中的错误还是我做错了什么?
答案 0 :(得分:0)
我可以在PyQt-5.7中确认这种行为。
这似乎是一个错误,因为http://www.w3schools.com/jsref/event_onmouseover.asp(PyQt5_gpl-5.7.1.dev1611251257)中没有出现同样的问题。因此,在PyQt-5.7.1发布之前,您似乎必须使用当前的解决方法。