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