Изменение размера шрифта QLabel Text в соответствии с прямоугольником - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь изменить размер шрифта текста в зависимости от размера QLabel для PyQt5.

self.label_4 = QtWidgets.QLabel(self.tab)
self.label_4.setGeometry(QtCore.QRect(310, 212, 101, 16))
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")

Я хотел бы что-то подобное, но текст будет обрезан, потому что текст слишком большой для поля QLabel.

Есть ли способ автоматически установить размер текста на основе его длины и размера QRect для соответствия размеру окна QLabel?

1 Ответ

0 голосов
/ 04 марта 2020

Этот вопрос был решен в этом ответе для Qt / C ++, поэтому мой ответ - Python перевод:

from PyQt5 import QtCore, QtGui, QtWidgets


def dSize(inner, outer):
    dy = inner.height() - outer.height()
    dx = inner.width() - outer.width()
    return max(dx, dy)


def f(fontSize, label):
    font = label.font()
    font.setPointSizeF(fontSize)
    label.setFont(font)
    d = dSize(label.sizeHint(), label.size())
    return d


def df(fontSize, label):
    if fontSize < 1.0:
        fontSize = 1.0
    return f(fontSize + 0.5, label) - f(fontSize - 0.5, label)


class LabelStretcher(QtCore.QObject):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.apply(parent)

    def apply(self, label):
        if label is not None:
            label.installEventFilter(self)

    def eventFilter(self, obj, ev):
        if ev.type() != QtCore.QEvent.Resize:
            return False
        if (
            not isinstance(obj, QtWidgets.QLabel)
            or not obj.text()
            or not obj.hasScaledContents()
        ):
            return False

        font = obj.font()
        fontSize = font.pointSizeF()
        for i in range(10):
            d = df(fontSize, obj)
            if d < 0.1:
                break
            fontSize -= f(fontSize, label) / d
        font.setPointSizeF(fontSize)
        label.setFont(font)
        return False


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.label = QtWidgets.QLabel(self)
        self.label.setText("StackOverflow")
        self.label.setGeometry(QtCore.QRect(310, 212, 105, 21))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        # for test
        self.label.setStyleSheet("QLabel { background-color : salmon;}")

        stretch = LabelStretcher(self.label)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = Widget()
    w.show()

    sys.exit(app.exec_())
...