【问题标题】:QListWidget doesn't show custom widget lablesQListWidget 不显示自定义小部件标签
【发布时间】:2021-01-19 02:37:19
【问题描述】:

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

【问题讨论】:

    标签: pyqt pyqt5


    【解决方案1】:

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

    理论上,QLabel 可以通过在构造函数中添加RadioWidget 实例作为父级来正确添加为子级:

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

    但这不会很好地工作:标签将在无线电小部件的左上角创建,但该小部件将对标签一无所知。 仅当为小部件设置了布局管理器时(或以某种方式重新实现时),小部件的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2014-07-14
      • 1970-01-01
      • 2019-04-09
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多