Почему QFontDialog.getFont() всегда возвращает один и тот же шрифт?
Каждый раз, когда я использую QFontDialog.getFont()
чтобы получить шрифт, он возвращает то же самое 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
2 ответа
ОБНОВЛЕНИЕ:
Кажется, это вызвано ошибкой, которая затрагивает только macOS: см. QTBUG-6071 и QTBUG-69878. Это должно было быть исправлено в Qt-5.12, поэтому вам нужно убедиться, что вы установили последние версии Qt5 и PyQt5, чтобы решить эту проблему.
Ниже приведен тестовый скрипт с некоторыми снимками экрана вывода, который я получаю в Linux, используя Qt-5.12.0 с PyQt- 5.11.3. Как видите, все работает как положено. Если у вас другое поведение, вы должны отредактировать свой вопрос и указать точные версии 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_())
Выход:
<PyQt5.QtGui.QFont object at 0x10b4287b8>
только дает вам местоположение в памяти вашего объекта, это в основном номер ячейки памяти, но в шестнадцатеричном виде. Вы можете иметь другой объект (здесь, другой объект QFont), хранящийся в том же пространстве памяти.
Вы можете проверить, что объект QFont здесь тот, который вы выбрали, выполнив это:
font, ok = QFontDialog.getFont()
print(font.toString())
Обновление: не могли бы вы попробовать следующий код и сообщить нам, что вы получаете?
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_()