1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

[Python] My custom label's text is uneven when rotated

Discussão em 'Python' iniciado por Stack, Novembro 27, 2025.

  1. Stack

    Stack Membro Participativo

    I've created a custom qlabel using pyqt, however the text is slightly uneven when rotated. I've attached a picture of this vs an unrotated label. I've tried fixing it with setRenderHint Antialiasing, TextAntialiasing, and SmoothPixmapTransform - but it doesn't seem to make a difference. If there was a way to properly align the text onto one level, that could possibly help?

    [​IMG]

    class Label(QtWidgets.QLabel):
    def __init__(self, parent=None, element=None):
    super().__init__(parent)

    self.element = element

    if self.element is not None:
    self.configuration = self._parse_element()

    self._text = self.configuration.attrib.get("Text", "")
    self._position_x, self._position_y = tuple(
    map(int, self.configuration.attrib.get("Position", "177,5").split(","))
    )
    self._width, self._height = tuple(
    map(int, self.configuration.attrib.get("Size", "267,27").split(","))
    )
    self._size_ratio = self.configuration.attrib.get("SizeRatio", "0.0")
    self._font = FontManager(
    self.configuration.attrib.get("Font", "Dialog#1#16")
    ).get_font()
    self._rotation = self.configuration.attrib.get("Rotation", "0.0")
    self._scale_x = self.configuration.attrib.get("ScaleX", "1.0")
    self._scale_y = self.configuration.attrib.get("ScaleY", "1.0")

    self._setup_visuals()

    def _parse_element(self):
    for child in self.element:
    if child.tag == "Configuration":
    return child
    return None

    def _setup_visuals(self):
    self.setStyleSheet("""
    background-color: none;
    border: none;
    margin: 0px;
    """)

    self.setText(self._text)

    fm = QtGui.QFontMetrics(self._font)
    text_width = fm.horizontalAdvance(self._text)
    text_height = fm.height()

    if float(self._size_ratio) > 0:
    self._height = int(self._width / float(self._size_ratio))

    self.move(self._position_x, self._position_y)
    self.resize(max(self._width, text_width), max(self._height, text_height))

    @typing_extensions.override
    def paintEvent(self, event):
    painter = QtGui.QPainter(self)
    painter.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing)
    painter.setRenderHint(QtGui.QPainter.RenderHint.TextAntialiasing)
    painter.setRenderHint(QtGui.QPainter.RenderHint.SmoothPixmapTransform)

    painter.setFont(self._font)

    painter.translate(0, 0)
    painter.rotate(degrees(float(self._rotation)))
    painter.scale(float(self._scale_x), float(self._scale_y))

    painter.drawText(0, 0, self.width(), self.height(), QtCore.Qt.AlignmentFlag.AlignLeft | QtCore.Qt.AlignmentFlag.AlignTop, self._text)

    @typing_extensions.override
    def sizeHint(self):
    fm = self.fontMetrics()

    w = fm.horizontalAdvance(self.text())
    h = fm.height()

    a = float(self._rotation)

    r_w = abs(w * cos(a)) + abs(h * sin(a))
    r_h = abs(w * sin(a)) + abs(h * cos(a))

    return QtCore.QSize(int(r_w), int(r_h))

    Continue reading...

Compartilhe esta Página