在我的應用程序中,我可能有多個QPlainTextEdit
小部件。我也有這個小部件的全局字體設置,當我在全局設置中更改此字體時,我希望新字體自動傳播到我的應用程序中所有現有的QPlainTextEdit
實例。我可能需要使用QApplication.setFont(font, "QPlainTextEdit")
,但這似乎適用於其他類型的小部件,但不適用於QPlainTextEdit
。如何在整個應用程序中爲QPlainTextEdit設置字體
我目前的workarund感覺非常黑客。我已重寫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
和QtGui
)測試了相同的結果,它按預期工作。所以這是要麼在PyQt5
錯誤,要麼我做錯了什麼?
我不能在Linux上使用Qt-4.8.7和PySide-1.2.4/PyQt-4.11.4來重現這一點。你能否提供證明問題的[mcve]?你在什麼平臺上,以及你使用的是什麼特定版本的Qt和PySide/PyQt? – ekhumoro
我試圖儘量減少這個問題,然後我發現我的問題是在其他地方比我想象的。我發現應用程序的字體沒有被傳播,因爲我已經在某一行顯式地設置了'QPlainTextEdit'的字體。然後,當我在那種情況下發現應用程序字體在某個窗口小部件類的應用程序範圍內發生更改時,它不會傳播到具有各自字體集的窗口小部件。 所以我很抱歉,這個問題是誤導性的,我很快就會刪除它。 –
好的。將您的評論置於答案中可能會更好,因爲其他人可能會從中受益。 – ekhumoro