Я пытаюсь добавить пользовательские RadioWidgets как QListWidgetItem в QListWidget. Отображается главное окно, и кажется, что элементы радиоуправления добавлены, но метки не отображаются. Это код, который я использую: ...

0
pouya 18 Янв 2021 в 21:17

1 ответ

Лучший ответ

Виджет, созданный без какого-либо родителя, считается окном верхнего уровня (до тех пор, пока не будет изменен родительский элемент, например, при добавлении в макет).

Теоретически QLabel может быть правильно добавлен как дочерний, добавив экземпляр RadioWidget в качестве родительского в конструкторе:

self.radioTitleLbl = QLabel(radioTitle, self)

Но это не сработает: метка будет создана в верхнем левом углу радио-виджета, но этот виджет не будет ничего знать о метке. SizeHint виджета возвращается на основе его содержимого только тогда, когда для виджета установлен менеджер компоновки (или когда каким-либо образом переопределен).

Поскольку для этого виджета не установлен диспетчер компоновки, в результате RadioWidget считает себя пустым , возвращая недопустимую подсказку (QSize(-1, -1)), и вы не увидите ни метку (ни элемент) потому что размер элемента изменен до нулевого.

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

Со следующей модификацией вам даже не нужно устанавливать sizeHint для QListWidgetItem, поскольку он автоматически будет использовать подсказку, возвращаемую виджетом:

class RadioWidget(QWidget):
    def __init__(self, parent: Optional[QWidget], radioTitle: str) -> None:
        super().__init__(parent=parent)
        layout = QVBoxLayout(self)
        self.radioTitleLbl = QLabel(radioTitle)
        layout.addWidget(self.radioTitleLbl)
0
musicamante 18 Янв 2021 в 18:37