Многострочная метка QT в вертикальном потоке перекрывает предыдущий элементPython

Программы на Python
Anonymous
Многострочная метка QT в вертикальном потоке перекрывает предыдущий элемент

Сообщение Anonymous »

Я хочу создать боковую панель в своем графическом интерфейсе, используя привязки QT5 и Python. На боковой панели я использую QVBoxLayout для добавления плиток, состоящих из значка фиксированной высоты и текста переменного размера.
У меня проблема с отображением, которую я не могу исправить. Смотрите следующий скриншот. Я добавил границы, чтобы показать проблему.
Изображение
< /p>

Код: Выделить всё

from qtpy.QtWidgets import QWidget, QVBoxLayout, QLabel, QSizePolicy
from qtpy.QtCore import Qt, QSize

from typing import List, Type

class Sidebar(QWidget):
SIDEBAR_ELEMENT_W = 64
SIDEBAR_W = SIDEBAR_ELEMENT_W + 12
SIDEBAR_ELEMENT_ICON_H = 48

def __init__(self, components) -> None:
super().__init__()
self.setFixedWidth(self.SIDEBAR_W)
self.setSizePolicy(QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding))
sidebar_layout = QVBoxLayout(self)
sidebar_layout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignVCenter)
sidebar_margin = (self.SIDEBAR_W - self.SIDEBAR_ELEMENT_W)//2
sidebar_layout.setContentsMargins(sidebar_margin,20,sidebar_margin,0)
sidebar_layout.setSpacing(0)
self._components = components.copy()

for component in self._components:
sidebar_element = QWidget()
sidebar_element.setProperty('class', 'sidebar_element')

element_layout = QVBoxLayout(sidebar_element)
element_layout.setSpacing(0)
element_layout.setContentsMargins(0,5,0,5)
sidebar_element.setMaximumWidth(self.SIDEBAR_ELEMENT_W)

icon_label = QLabel()
icon = component.get_icon()

icon_label.setFixedHeight(self.SIDEBAR_ELEMENT_ICON_H)
icon_label.setPixmap(icon.scaled(QSize(icon_label.width(), icon_label.height()), Qt.AspectRatioMode.KeepAspectRatio))

text = QLabel(component.get_name(), sidebar_element)
text.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignCenter)
text.setWordWrap(True)
text.setStyleSheet("border:1px solid blue")

element_layout.addWidget(icon_label)
element_layout.addWidget(text)

sidebar_layout.addWidget(sidebar_element)

Как мы видим, когда текстовая метка занимает более одной строки, блок увеличивается вверх и перекрывает значок. Я перепробовал множество настроек, но в итоге либо обрезал вторую строку, либо растягивал элемент до самого нижнего края окна.
Буду признателен за любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/790 ... us-element

Вернуться в «Python»