QListWidget 不显示自定义小部件标签

QListWidget doesn't show custom widget lables

我正在尝试将自定义 RadioWidget 作为 QListWidgetItem 添加到 QListWidget。显示了主窗口,似乎添加了 radiowidget 项,但未显示标签。这是我正在使用的代码:

from typing import Optional
from PyQt5.QtWidgets import QLabel, QWidget


class RadioWidget(QWidget):

    def __init__(self, parent: Optional[QWidget], radioTitle: str) -> None:
        super().__init__(parent=parent)
        self.radioTitleLbl = QLabel(radioTitle)
import sys
from typing import Optional
from PyQt5.QtWidgets import (
    QApplication,
    QListWidget,
    QListWidgetItem,
    QMainWindow,
    QWidget,
)

from vagh.radiowidget import RadioWidget


class Vagh(QMainWindow):
    def __init__(self, parent: Optional[QWidget] = None) -> None:
        super().__init__(parent=parent)
        self.radiosList = QListWidget(self)
        self.radios = ("radio1", "radio2", "radio3")
        self.loadRadios()
        self.setCentralWidget(self.radiosList)
        self.show()

    def loadRadios(self):
        for radio in self.radios:
            radioItem = QListWidgetItem(self.radiosList)
            radioWidget = RadioWidget(self.radiosList, radio)
            radioItem.setSizeHint(radioWidget.sizeHint())
            self.radiosList.addItem(radioItem)
            self.radiosList.setItemWidget(radioItem, radioWidget)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    v = Vagh()
    app.exec_()

在没有任何 parent 的情况下创建的小部件被视为 顶级 window(例如,直到它被重新parented添加到布局时)。

理论上,通过在构造函数中将 RadioWidget 实例添加为 parent,可以将 QLabel 正确添加为 child:

self.radioTitleLbl = QLabel(radioTitle, <b>self</b>)

但这不会很好地工作:标签将创建在单选小部件的左上角,但该小部件将对标签一无所知。 仅当为小部件设置了布局管理器(或以某种方式重新实现时)时,才会根据其内容返回小部件的 sizeHint。

由于没有为该小部件设置布局管理器,结果是 RadioWidget 认为自己 ,返回无效提示 (QSize(-1, -1)),您将不会请参阅标签(也不是项目),因为项目已调整为空大小。

像往常一样,应始终使用布局管理器。
不仅:将标签添加到布局可确保它在文本更改时正确调整自身大小。

通过以下修改,您甚至不需要在 QListWidgetItem 上设置 sizeHint,因为它会自动使用小部件返回的提示:

class RadioWidget(QWidget):
    def __init__(self, parent: 可选[QWidget], radioTitle: str) -> None:
        超级().__init__(parent=parent)
        <b>layout = QVBoxLayout(self)</b>
        self.radioTitleLbl = QLabel(radioTitle)
        <b>layout.addWidget(self.radioTitleLbl)</b>