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