Пользовательские элементы в QListView - PullRequest
5 голосов
/ 23 ноября 2011

Я (очень) новичок в PyQT и QT в целом, и мне нужно быстро спроектировать пользовательский интерфейс, который в целом похож на современные 2-х панельные почтовые приложения: слева список писем, справа редактор. Я хотел бы дать немного больше информации, чем просто строку для отображения в QListView - в основном это название элемента жирным шрифтом, ниже двух строк с описанием в другом стиле и в верхнем левом углу набор тегов значки Кроме того, список должен будет обновляться каждые несколько секунд или около того (вероятно, с изменениями только для очень немногих элементов), поэтому я не хочу переписывать данные каждый раз.

Из того, что я прочитал в различных руководствах и руководствах, есть разные способы сделать это, и я не уверен, какой метод наиболее часто используется (другие люди должны будут работать с кодом, как только я составлю основное приложение). ) - какие объекты и методы вы бы использовали - QListView или QListWidget, а затем подклассы QAbstractListModel или QStandardItemModel, ...?

Ответы [ 2 ]

4 голосов
/ 26 ноября 2011

Если вы не хотите думать о своей модели или действительно разделяете представления, то 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

2 голосов
/ 23 ноября 2011

Если пользователи не изменяют данные вручную в списке писем, вы можете легко использовать один из классов моделей с пользовательским QStyledItemDelegate (или QAbstractItemDelegate ).Взгляните на пример в документации QAbstractItemDelegate, ссылки на которую приведены выше, а также на пример Star Delegate .

Если пользователям действительно необходимо изменить данные, встроенные в список писем,и список электронных писем достаточно отличается от стандартных виджетов, становится немного сложнее убедиться, что редактор выглядит достаточно похожим на представление презентации.Это не невозможно, но это одна из самых сложных задач.

Вы можете обойтись без использования QStandardItemModel .Но ... Я обычно рекомендую создать модель предметной области с помощью оболочки Qt (в вашем случае QAbstractListModel ) для всего нетривиального.

...