为什么 QFontDialog.getFont() 总是 return 相同的字体?
Why does QFontDialog.getFont() always return the same font?
每次我使用 QFontDialog.getFont()
获取字体时,它 returns 相同的 QFont
对象。
font, ok = QFontDialog.getFont()
print(font)
if ok:
self.lbl.setFont(font)
print(self.lbl.font())
上面是代码段,下面是结果(我做了不同的选择,但是QLabel
的字体和我从getFont()
得到的字体总是一样的)。
/Users/yao/PycharmProjects/QT_test/venv/bin/python /Users/yao/PycharmProjects/QT_test/test/4_2.py
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>
更新:
以下是关于我的环境的一些信息:
- macOS 莫哈韦
- PyQt5
- Python 3.6
我测试了@ekhumoro 的代码,结果很奇怪:
BEFORE:
string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
family:.SF NS Text
size:13
AFTER:
string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
family:.SF NS Text
size:13
<PyQt5.QtGui.QFont object at 0x10b4287b8>
只给你你的对象在内存中的位置,它基本上是一个内存单元号,但是是十六进制的。您可以将不同的对象(此处为不同的 QFont 对象)存储在同一内存中 space.
您可以检查这里的 QFont 对象是否是您选择的对象:
font, ok = QFontDialog.getFont()
print(font.toString())
Update: Could you try the following code and tell us what you get?
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QLabel, QApplication, QDialog, QVBoxLayout
app = QApplication(sys.argv)
dlg = QDialog()
layout = QVBoxLayout()
for fontname in ["Verdana", "Arial", "Consolas"]:
widget = QLabel(fontname)
font = QFont(fontname)
widget.setFont(font)
layout.addWidget(widget)
dlg.setLayout(layout)
dlg.show()
r = app.exec_()
更新:
这似乎是由只影响 macOS 的错误引起的:请参阅 QTBUG-6071 and QTBUG-69878。这应该已在 Qt-5.12 中修复,因此您需要确保已安装最新版本的 Qt5 和 PyQt5 才能解决此问题。
下面是一个测试脚本,其中包含我在 Linux 上使用 Qt-5.12.0 和 PyQt-5.11.3 获得的一些输出屏幕截图。如您所见,一切都按预期进行。如果你得到不同的行为,你应该 edit your question 并说明你正在使用的 Qt 和 PyQt 的确切版本,你正在测试的平台,并显示测试脚本的一些示例输出。
测试脚本:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.button = QtWidgets.QPushButton('Change Font')
self.button.clicked.connect(self.updateLabel)
self.label = QtWidgets.QLabel()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.updateLabel()
def updateLabel(self):
if self.label.text():
new = QtWidgets.QFontDialog.getFont()[0]
else:
new = QtGui.QFont(self.label.font())
before = self.label.font()
self.label.setFont(new)
after = self.label.font()
text = []
for font in before, after:
info = QtGui.QFontInfo(font)
text.append('BEFORE:' if font is before else 'AFTER:')
text.append(' string: %s' % font.toString())
text.append(' family: %s' % info.family())
text.append(' size: %s' % info.pointSize())
text.append('')
text = '\n'.join(text)
self.label.setText(text)
print(text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(800, 100, 500, 100)
window.show()
sys.exit(app.exec_())
输出:
每次我使用 QFontDialog.getFont()
获取字体时,它 returns 相同的 QFont
对象。
font, ok = QFontDialog.getFont()
print(font)
if ok:
self.lbl.setFont(font)
print(self.lbl.font())
上面是代码段,下面是结果(我做了不同的选择,但是QLabel
的字体和我从getFont()
得到的字体总是一样的)。
/Users/yao/PycharmProjects/QT_test/venv/bin/python /Users/yao/PycharmProjects/QT_test/test/4_2.py
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>
<PyQt5.QtGui.QFont object at 0x10b428748>
<PyQt5.QtGui.QFont object at 0x10b4287b8>
更新:
以下是关于我的环境的一些信息:
- macOS 莫哈韦
- PyQt5
- Python 3.6
我测试了@ekhumoro 的代码,结果很奇怪:
BEFORE:
string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
family:.SF NS Text
size:13
AFTER:
string:.SF NS Text, 13,-1,5,50,0,0,0,0,0
family:.SF NS Text
size:13
<PyQt5.QtGui.QFont object at 0x10b4287b8>
只给你你的对象在内存中的位置,它基本上是一个内存单元号,但是是十六进制的。您可以将不同的对象(此处为不同的 QFont 对象)存储在同一内存中 space.
您可以检查这里的 QFont 对象是否是您选择的对象:
font, ok = QFontDialog.getFont()
print(font.toString())
Update: Could you try the following code and tell us what you get?
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QLabel, QApplication, QDialog, QVBoxLayout
app = QApplication(sys.argv)
dlg = QDialog()
layout = QVBoxLayout()
for fontname in ["Verdana", "Arial", "Consolas"]:
widget = QLabel(fontname)
font = QFont(fontname)
widget.setFont(font)
layout.addWidget(widget)
dlg.setLayout(layout)
dlg.show()
r = app.exec_()
更新:
这似乎是由只影响 macOS 的错误引起的:请参阅 QTBUG-6071 and QTBUG-69878。这应该已在 Qt-5.12 中修复,因此您需要确保已安装最新版本的 Qt5 和 PyQt5 才能解决此问题。
下面是一个测试脚本,其中包含我在 Linux 上使用 Qt-5.12.0 和 PyQt-5.11.3 获得的一些输出屏幕截图。如您所见,一切都按预期进行。如果你得到不同的行为,你应该 edit your question 并说明你正在使用的 Qt 和 PyQt 的确切版本,你正在测试的平台,并显示测试脚本的一些示例输出。
测试脚本:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.button = QtWidgets.QPushButton('Change Font')
self.button.clicked.connect(self.updateLabel)
self.label = QtWidgets.QLabel()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.button)
self.updateLabel()
def updateLabel(self):
if self.label.text():
new = QtWidgets.QFontDialog.getFont()[0]
else:
new = QtGui.QFont(self.label.font())
before = self.label.font()
self.label.setFont(new)
after = self.label.font()
text = []
for font in before, after:
info = QtGui.QFontInfo(font)
text.append('BEFORE:' if font is before else 'AFTER:')
text.append(' string: %s' % font.toString())
text.append(' family: %s' % info.family())
text.append(' size: %s' % info.pointSize())
text.append('')
text = '\n'.join(text)
self.label.setText(text)
print(text)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(800, 100, 500, 100)
window.show()
sys.exit(app.exec_())
输出: