Этот вопрос был решен в этом ответе для 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_())