Добавить QWidget в QListWidget

Я пытаюсь сделать QListWidget, в котором каждый элемент представляет собой простой виджет, который содержит текст и кнопку. Я использую следующее:

itemN = QtGui.QListWidgetItem() 
#Create widget
widget = QtGui.QWidget()
widgetText =  QtGui.QLabel("I love PyQt!")
widgetButton =  QtGui.QPushButton("Push Me")
widgetLayout = QtGui.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()
widget.setLayout(widgetLayout)
#Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)

Проблема в том, что ничего не появляется. Я получаю пустую строку, по которой я могу перемещаться с помощью клавиатуры, но она пустая. Когда виджет содержит только кнопку, он работает, так что это не так, как будто одна кнопка только что-то испортила. Существуют ли ограничения на сложность виджетов, которые может обрабатывать setItemWidget? Возможно, мне нужно выйти за рамки удобных классов, как предлагается в некоторых из соответствующих постов ниже?

Похожие сообщения

pyqt добавление виджета в QListWidget
Обратите внимание, что предыдущий пост имеет похожий заголовок на мой, но, похоже, это относительно слабо выраженный вопрос о сложном коде кода из QtDesigner (смешанного с некоторыми пользовательскими вещами). Совершенно не ясно, что на самом деле это вопрос, который должен был задать человек. Хотя название делает его дубликатом, вопрос (я молюсь) - нет.

Я бы сказал что-то похожее об этом посте.

QListWidgetItem с переключателем

QListView/QListWidget с пользовательскими элементами и виджетами пользовательских элементов

Добавление пользовательского виджета в QListWidget в вопросе щелчка QT в QT?

pyqt добавление виджета в QListWidget

http://www.qtcentre.org/threads/8660-Drawing-a-widget-in-QItemDelegate-s-paint-method

http://developer.nokia.com/community/discussion/showthread.php/211634-Adding-a-button-inside-QListWidgetItem

Ответ 1

Попробуйте следующее:

itemN = QtGui.QListWidgetItem() 
#Create widget
widget = QtGui.QWidget()
widgetText =  QtGui.QLabel("I love PyQt!")
widgetButton =  QtGui.QPushButton("Push Me")
widgetLayout = QtGui.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()

widgetLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize)
widget.setLayout(widgetLayout)  
itemN.setSizeHint(widget.sizeHint())    

#Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)

Как вы можете видеть, вам нужно setSizeConstraint к макету и setSizeHint к элементу.

Ответ 2

Если вы используете PyQt5, есть некоторые изменения, вы должны использовать QtWidgets для виджета, а не QtGui. Используйте этот код при использовании с PyQt5:

Не забудьте импортировать PyQt5:

from PyQt5 import QtCore, QtGui, QtWidgets'

itemN = QtWidgets.QListWidgetItem()
# Create widget
widget = QtWidgets.QWidget()
widgetText = QtWidgets.QLabel("I love PyQt!")
widgetButton = QtWidgets.QPushButton("Push Me")
widgetLayout = QtWidgets.QHBoxLayout()
widgetLayout.addWidget(widgetText)
widgetLayout.addWidget(widgetButton)
widgetLayout.addStretch()

widgetLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
widget.setLayout(widgetLayout)
itemN.setSizeHint(widget.sizeHint())

# Add widget to QListWidget funList
funList.addItem(itemN)
funList.setItemWidget(itemN, widget)