Search code examples
qtpyqt5qlistwidgetqtwidgets

PyQt QListWidget doesn't show custom widgets as items


I want to add NodeLinkItemWidgetUI forms (custom widget) as items to the ListWidget in my main app. The problem is, that the items of the correct widget size get added to the list as items but the item content is empty. Here is the code for the item custom widget from NodeLinkItemWidgetUI:

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_Form(QtWidgets.QWidget):
    def __init__(self, nodename, nodeclass, parent=None):
        super(Ui_Form,self).__init__(parent)
        self.comboBox_type = QtWidgets.QComboBox()
        self.comboBox_type.setGeometry(QtCore.QRect(10, 100, 51, 25))
        self.comboBox_type.setCurrentText("connector")
        self.comboBox_type.setObjectName("comboBox_type")
        self.comboBox_type.addItem("")
        self.comboBox_type.setItemText(0, "connector")
        self.comboBox_type.addItem("")
        self.comboBox_type.setItemText(1, "dot")
        self.comboBox_type.addItem("")
        self.comboBox_type.setItemText(2, "link")
        self.checkBox_hide = QtWidgets.QCheckBox()
        self.checkBox_hide.setGeometry(QtCore.QRect(70, 100, 51, 23))
        self.checkBox_hide.setText("hide")
        self.checkBox_hide.setIconSize(QtCore.QSize(16, 16))
        self.checkBox_hide.setTristate(False)
        self.checkBox_hide.setObjectName("checkBox_hide")
        self.pushButton = QtWidgets.QPushButton()
        self.pushButton.setGeometry(QtCore.QRect(10, 130, 111, 25))
        self.pushButton.setText("create")
        self.pushButton.setObjectName("pushButton")
        self.label_icon = QtWidgets.QLabel()
        self.label_icon.setGeometry(QtCore.QRect(15, 10, 100, 80))
        self.label_icon.setText("")
        self.label_icon.setObjectName("label_icon")
        self.label_nodename = QtWidgets.QLabel()
        self.label_nodename.setGeometry(QtCore.QRect(15, 10, 100, 80))
        font = QtGui.QFont()
        font.setWeight(75)
        font.setBold(True)
        self.label_nodename.setFont(font)
        self.label_nodename.setText(nodename)
        self.label_nodename.setAlignment(QtCore.Qt.AlignCenter)
        self.label_nodename.setObjectName("label_nodename")
        QtCore.QMetaObject.connectSlotsByName(self)

and here the code from my main app where they get added to my listwidget as items:

class Connecthor(QtWidgets.QMainWindow, Ui_MainWindow):
#constructor
def __init__(self, parent=None):
    super(Connecthor, self).__init__(parent)
    self.setupUi(self)

    self.setFixedSize(self.size())

    #ADDING TEST WIDGETS
    for i in range(5):
        self.createNewLink("test","")


def createNewLink(self, nodename, nodeclass):
    item = QtWidgets.QListWidgetItem(self.listWidget_links)
    item_widget = NodeLinkItemWidgetUI.Ui_Form(nodename=nodename, nodeclass=nodeclass)

    #size hint doesn't return the correnct widget size so I did set it manually
    # print item_widget.sizeHint()
    # item.setSizeHint(item_widget.sizeHint())

    item.setSizeHint(QtCore.QSize(130, 160))
    self.listWidget_links.addItem(item)
    self.listWidget_links.setItemWidget(item, item_widget)

Solution

  • A widget only shows other widgets inside if these are your children, in your self.comboBox_type, self.checkBox_hide, self.pushButton and self.label_icon have no father so they will not show up, the solution is to pass a parent, in this case self.

    class Ui_Form(QtWidgets.QWidget):
        def __init__(self, nodename, nodeclass, parent=None):
            super(Ui_Form,self).__init__(parent)
            self.comboBox_type = QtWidgets.QComboBox(self) # <---
            ...
            self.checkBox_hide = QtWidgets.QCheckBox(self)
            ...
            self.pushButton = QtWidgets.QPushButton(self) # <---
            ...
            self.label_icon = QtWidgets.QLabel(self) # <---
            ...