Если вы не хотите думать о своей модели или действительно разделяете представления, то QListWidget предназначен для этой цели. Вы просто работаете со списком напрямую, и данные хранятся в его собственной базовой модели.
Для QListWidget вы можете использовать: QListWidget.setItemWidget (элемент QListWidgetItem, виджет QWidget)
Это повлечет за собой создание собственного виджета, который выглядит так, как вы хотите, с QLabels для отображения текста и изображений. Затем вы добавили бы их в QListWidget, выполнив:
# create item widget
item = QListWidgetItem()
w = CustomItemWidget()
w.setTitle = "Title"
w.setDescription = "Blah blah"
# would have a QPixmap already cached
w.setBadgeImage = preCreatedPixmaps['thisBadge']
listWidget.insertItem(item)
listWidget.setItemWidget(item, w)
Плюсом является то, что вы можете управлять внешним видом элементов довольно просто, без необходимости писать более сложный делегат.
Недостатком этого подхода является то, что вы на самом деле не делитесь моделью с другим представлением, и вам приходится управлять созданием виджетов, когда нужно добавлять новые элементы. И этот метод предполагает, что отображение виджета будет статичным. Они не хотели бы быть изменены после того, как они установлены. Это также может быть медленнее, если у вас их тысячи.
Создание делегата для ваших элементов в QListView - более быстрый подход с точки зрения производительности, но немного более технический ...
Смотрите здесь для примера (хотя это на C ++, но легко понять
http://www.qtcentre.org/threads/27777-Customize-QListWidgetItem-how-to?p=131746#post131746
Еще один пример в python, хотя в коде нет отступов табуляции:
http://www.qtcentre.org/archive/index.php/t-31029.html