簡體   English   中英

在ListWidget中充氣自定義小部件-PyQt5

[英]Inflate custom widget in ListWidget - PyQt5

我正在嘗試設計一個項目列表,每個項目都是一個自定義窗口小部件(盡管不一定,我想在每個項目中顯示一個圖像和三個文本)。 在PyQt中,功能addItem可用於將一個項目添加到以QListWidgetItem作為參數的列表中。

因此,我嘗試將自定義定義的窗口小部件強制轉換為QListWidetItem,但沒有成功。 我嘗試了以下代碼塊:

listWidget = QtWidgets.QListWidget(self.centralwidget)
item = QListWidgetItem(self.listWidget)
custom_item = CustomWidget()
listWidget.addItem(item)
listWidget.setItemWidget(item, item_widget)

該列表顯示一個空列表,這是可以預期的,因為我從來沒有用上述代碼誇大custom_item。 如何在PyQT中解決此問題?

我不確定,但是自定義窗口小部件可能是相關的:

class CustomWidget(QWidget):
    def __init__(self, user):
        QWidget.__init__(self)
        self.user = user
        self.horizontalLayoutWidget = QtWidgets.QWidget()
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 211, 41))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.UserImage = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.UserImage.setText("This is an Image")
        self.UserImage.setObjectName("UserImage")
        self.horizontalLayout.addWidget(self.UserImage)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.UserName = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.UserName.setText("My name is jeff")
        self.UserName.setObjectName("UserName")
        self.verticalLayout.addWidget(self.UserName)
        self.UserStatus = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.UserStatus.setText("I am available")
        self.UserStatus.setObjectName("UserStatus")
        self.verticalLayout.addWidget(self.UserStatus)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.horizontalLayout.setStretch(0, 1)
        self.horizontalLayout.setStretch(1, 3)

我從您的代碼中注意到,該窗口小部件未正確構建, self.horizontalLayout是主要窗口小部件,但沒有父級,因此永遠不會被繪制,此外您還可以避免使用該窗口小部件。 另一方面,您必須使用setSizeHint()設置項目的大小:

from PyQt5 import QtWidgets, QtCore

class CustomWidget(QtWidgets.QWidget):
    def __init__(self, user, *args, **kwargs):
        QtWidgets.QWidget.__init__(self, *args, **kwargs)
        self.user = user
        self.setGeometry(QtCore.QRect(0, 0, 211, 41))
        self.horizontalLayout = QtWidgets.QHBoxLayout(self)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.UserImage = QtWidgets.QLabel(self)
        self.UserImage.setText("This is an Image")
        self.UserImage.setObjectName("UserImage")
        self.horizontalLayout.addWidget(self.UserImage)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.UserName = QtWidgets.QLabel(self)
        self.UserName.setText("My name is jeff")
        self.UserName.setObjectName("UserName")
        self.verticalLayout.addWidget(self.UserName)
        self.UserStatus = QtWidgets.QLabel(self)
        self.UserStatus.setText("I am available")
        self.UserStatus.setObjectName("UserStatus")
        self.verticalLayout.addWidget(self.UserStatus)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.horizontalLayout.setStretch(0, 1)
        self.horizontalLayout.setStretch(1, 3)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    listWidget = QtWidgets.QListWidget()
    item = QtWidgets.QListWidgetItem(listWidget)
    item_widget = CustomWidget("user")
    listWidget.addItem(item)
    listWidget.setItemWidget(item, item_widget)
    item.setSizeHint(item_widget.sizeHint())
    listWidget.show()
    sys.exit(app.exec_())

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM