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

时间:2021-01-18 18:17:46

标签: pyqt pyqt5

我正在尝试将自定义 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_()

1 个答案:

答案 0 :(得分:0)

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

理论上,通过在构造函数中将 RadioWidget 实例添加为父对象,可以正确地将 QLabel 添加为子对象:

self.radioTitleLbl = QLabel(radioTitle, self)

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

由于没有为那个小部件设置布局管理器,结果是 RadioWidget 认为自己,返回一个无效的提示(QSize(-1, -1)),你将看不到标签(也项目),因为项目已调整为空大小。

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

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

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)
相关问题