QListView中的自定义项

时间:2011-11-23 18:17:36

标签: python pyqt pyqt4

我(非常)对PyQT和QT很新,并且必须快速设计一个与现代双窗格邮件应用程序大致相似的用户界面:留下一个邮件列表,一个编辑器。我想提供一些信息,而不仅仅是一个字符串,以便在QListView中显示 - 基本上是粗体文本中的项目名称,下面是两行,描述的风格不同,左上角是一组标签般的徽章。此外,列表必须每隔几秒左右更新一次(可能只更改很少的项目),所以我不想每次都重写数据。

从我在各种手册和教程中看到的内容,有不同的方法来实现这一点,我不确定最常用的方法是什么(其他人在我选择核心应用程序后必须使用代码) - 您将使用哪些对象和方法 - QListViewQListWidget,然后继承QAbstractListModelQStandardItemModel,......?

2 个答案:

答案 0 :(得分:4)

如果你不想考虑你的模型,或者真的在视图之间共享,那么QListWidget就是为了这个目的。您只需直接处理List,数据就存储在自己的底层模型中。 对于QListWidget,您可以使用:QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) 这将需要您创建自己的小部件,以您想要的方式,为您的文本和像素图显示QLabel。然后,您可以通过执行以下操作将它们添加到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

答案 1 :(得分:2)

如果用户未手动更改邮件列表中的数据,则您可以轻松地使用其中一个模型类与自定义QStyledItemDelegate(或QAbstractItemDelegate)。请查看上面链接的QAbstractItemDelegate文档中的示例以及Star Delegate示例。

如果用户确实需要在邮件列表中更改内联数据,并且电子邮件列表与标准窗口小部件完全不同,那么确保编辑器看起来与演示视图。这不是不可能的,但那是更难的部分之一。

你可以使用QStandardItemModel逃脱。但是......我通常建议使用Qt(在您的情况下为QAbstractListModel)包装器创建一个域模型,以用于任何非平凡的事情。