2011-11-23 2 views
5

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

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

ответ

4

Если вы не хотите думать о своей модели или действительно делиться между видами, то для этой цели предназначен QListWidget. Вы просто имеете дело со списком напрямую, а данные хранятся в собственной базовой модели. Для QListWidget вы можете использовать: QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) Это повлечет за собой создание собственного виджета, который выглядит так, как вы хотите, с QLabels для отображения текста и pixmap. Тогда вы бы добавить их к 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

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

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

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

+0

Некоторые условии ссылки мертвы – user1767754

Смежные вопросы