Контейнер внутри списка PyQt
Я пытаюсь сделать список фильмов в виде списка на PyQt.
Виджет QListWidget способен хранить только строки.
Есть ли виджет, который может внутри себя хранить контейнер с виджетами и отображаться в виде списка?
Ответы (1 шт):
Да, все можно реализовать. Как вариант:
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
Устанавливает виджет, который будет отображаться в данном элементе.
Эту функцию следует использовать только для отображения статического содержимого вместо элемента виджета списка. Если вы хотите отображать настраиваемый динамический контент или реализовать настраиваемый виджет редактора, используйте вместо этого QListView и подкласс QStyledItemDelegate.
import sys
from PyQt5.QtCore import QSize, pyqtSignal
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QPushButton,\
QListWidgetItem, QVBoxLayout, QListWidget, QApplication, QGridLayout, QLabel
class ItemWidget(QWidget):
itemDeleted = pyqtSignal(QListWidgetItem)
def __init__(self, text, item, *args, **kwargs):
super(ItemWidget, self).__init__(*args, **kwargs)
self._item = item # Сохраните ссылку на объект элемента списка
layout = QGridLayout(self)
layout.addWidget(QLabel(f'Hello {text}', self), 0, 0)
layout.addWidget(QLineEdit(text, self), 1, 0)
layout.addWidget(QPushButton('x', self, clicked=self.doDeleteItem), 0, 1, 2, 1)
def doDeleteItem(self):
self.itemDeleted.emit(self._item)
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
layout = QVBoxLayout(self)
# Список
self.listWidget = QListWidget(self)
layout.addWidget(self.listWidget)
# Кнопка очистки
self.clearBtn = QPushButton('Очистить весь список', self, clicked=self.doClearItem)
layout.addWidget(self.clearBtn)
# Добавить данные
self.testData()
def doDeleteItem(self, item):
# Получить количество строк, соответствующих item
row = self.listWidget.indexFromItem(item).row()
# Удалить item
item = self.listWidget.takeItem(row)
# Удалить widget
self.listWidget.removeItemWidget(item)
del item
def doClearItem(self):
# Clear all items
for _ in range(self.listWidget.count()):
item = self.listWidget.takeItem(0)
self.listWidget.removeItemWidget(item)
del item
def testData(self):
# Создать данные
for i in range(10):
item = QListWidgetItem(self.listWidget)
item.setSizeHint(QSize(200, 60))
widget = ItemWidget('item: {}'.format(i), item, self.listWidget)
# Сигнал удаления привязки
widget.itemDeleted.connect(self.doDeleteItem)
self.listWidget.setItemWidget(item, widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
