Когда я использую QFontMetrics в PyQt5, числа, которые я получаю, не соответствуют размеру текста, который я рисую с помощью drawText.

Я пытаюсь получить размер текста, поэтому я могу соответствующим образом масштабировать его, чтобы он поместился в поле. Но, к сожалению, QFontMetrics.width(), похоже, дает неверные результаты.

Вот код, который рисует текст и использует значения из QFontMetrics для рисования прямоугольника, который должен быть аналогичного размера. Но это не так. Как вы можете видеть на картинке ниже, значения из QFontMetrics (нарисованный прямоугольник) составляют примерно половину того, что я рисую. И, к сожалению, я не могу просто умножить на 2, потому что в зависимости от текста коэффициент может быть 1,85 или 1,95.

      from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPainter, QTextDocument, QFont, QFontMetrics
from PyQt5.QtCore import QRect, Qt, QRectF
import sys

font = QFont("times",10)
fm = QFontMetrics(font)



class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.InitWindow()

    def InitWindow(self):
        self.setWindowIcon(QtGui.QIcon("icon.png"))
        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)

        painter.setFont(font)

        sText = 'Hello World!'
        painter.drawText(0,100, sText)

        pixelsWide = fm.width(sText)
        pixelsHigh = fm.height()
        painter.drawRect(0, 100, pixelsWide, pixelsHigh)




App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

1 ответ

Как поясняется в документации QFont :

Обратите внимание, что экземпляр QGuiApplication должен существовать, прежде чем можно будет использовать QFont.

Это, очевидно, включает использование QFont в качестве конструктора QFontMetrics.

Причина проста и вполне очевидна: приложение QApplication должно знать о среде пользовательского интерфейса, чтобы правильно вычислять метрики шрифта, которые могут зависеть от устройства рисования, на котором они будут отображаться. Рассмотрим распространенный случай масштабирования шрифта или настроек High DPI: без QGuiApplication Qt абсолютно не имеет смысла знать эти аспекты, и QFont не должен (и не может) явно заботиться об этом в своем конструкторе, как QFontMetrics не будет.

Переместите конструктор QFont и QFontMetrics в другое место, которое может быть в любой момент после создания QApplication и до их фактического использования.

Другие вопросы по тегам