2011-11-23 90 views
5

我對PyQT和QT一般都很新,並且必須快速設計一個與現代2窗格郵件應用程序大致相似的用戶界面:留下一個郵件列表,一個編輯器。我想給出一些信息,而不僅僅是要在QListView中顯示的字符串 - 基本上,項目名稱以粗體文本顯示,下面兩行用不同樣式描述,左上角顯示一組標籤狀徽章。此外,列表必須每隔幾秒左右更新一次(可能只需要更改很少的項目),所以我不想每次重寫數據。QListView中的自定義項目

從我在各種手冊和教程中看到的,有不同的方式來完成這一點,我不確定最常用的方法是什麼(其他人一旦起草了核心,將不得不使用代碼應用程序) - 您將使用哪些對象和方法 - QListViewQListWidget,然後子類別QAbstractListModelQStandardItemModel,...?

回答

4

如果你不想考慮你的模型,或者真的在視圖之間共享,那麼QListWidget就是爲了這個目的。您只需直接處理列表,並將數據存儲在其自己的基礎模型中。 對於QListWidget,您可以使用:QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) 這就需要您創建您自己的窗口小部件,它看起來像您想要的樣子,併爲您的文本和像素圖顯示器提供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

如果用戶沒有手動更改郵件列表中的數據,則可以使用自定義QStyledItemDelegate(或QAbstractItemDelegate)的一個模型類輕鬆使用。看一下上面鏈接的QAbstractItemDelegate文檔中的示例以及Star Delegate示例。

如果用戶確實需要更改郵件列表中的內聯數據,並且電子郵件列表與標準窗口小部件完全不同,那麼確保編輯器看起來非常類似於演示視圖。這不是不可能的,但那是更難的部分之一。

您可以使用QStandardItemModel逃脫。但是,我通常建議創建一個Qt的域模型(在你的情況下,QAbstractListModel)包裝任何非平凡的東西。

+0

有些提供的鏈接都死了 – user1767754