重新缩放QLabel文本字体大小以适合矩形

问题描述 投票:0回答:1

我正在尝试根据PyQt5的QLabel的大小来更改文本的字体大小。

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框?

python python-3.x pyqt pyqt5 qlabel
1个回答
0
投票

这个问题在Qt / C ++的this answer中已解决,所以我的答案是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_())
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.