Почему QFontDialog.getFont () всегда возвращает один и тот же шрифт? - PullRequest
0 голосов
/ 02 февраля 2019

Каждый раз, когда я использую 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 Mojave
  • 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 ]

0 голосов
/ 05 февраля 2019

ОБНОВЛЕНИЕ :

Это, вероятно, вызвано ошибкой, которая затрагивает только 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_())

Выход :

enter image description here enter image description here enter image description here

0 голосов
/ 04 февраля 2019

<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_()
...