나는 사용자 정의 추가하려고 해요 RadioWidget
로들 QListWidgetItem
A와 QListWidget
. Mainwindow가 표시되고 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_()
부모없이 생성 된 위젯은 최상위 창으로 간주됩니다 (예 : 레이아웃에 추가 될 때 부모가 다시 지정 될 때까지).
이론적으로 QLabel은 RadioWidget
생성자에서 인스턴스를 부모로 추가하여 자식으로 올바르게 추가 할 수 있습니다 .
self.radioTitleLbl = QLabel(radioTitle, self)
그러나 이것은 잘 작동하지 않을 것입니다. 라벨은 라디오 위젯의 왼쪽 상단에 생성되지만 그 위젯은 라벨에 대해 아무것도 알지 못합니다 . 위젯의 sizeHint는 레이아웃 관리자가 위젯에 대해 설정된 경우 (또는 어떤 식 으로든 다시 구현 될 때)에만 해당 콘텐츠를 기반으로 반환됩니다.
해당 위젯에 대해 레이아웃 관리자가 설정되지 않았기 때문에 결과적으로 RadioWidget은 자신이 비어있는 것으로 간주 하여 잘못된 힌트 ( QSize(-1, -1)
)를 반환 하고 항목의 크기가 null 크기로 조정되기 때문에 레이블 (항목 없음)이 표시되지 않습니다.
평소처럼 항상 레이아웃 관리자를 사용해야합니다.
뿐만 아니라 레이아웃에 레이블을 추가하면 텍스트가 변경 될 때마다 올바르게 크기가 조정됩니다.
다음 수정으로 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)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다