2011-11-23 10 views
5

Jestem (bardzo) nowy w PyQT i QT w ogóle i muszę szybko zaprojektować interfejs użytkownika, który jest zasadniczo podobny do współczesnych aplikacji pocztowych z dwiema kartami: pozostawiono listę wiadomości, prawo do edytora. Chciałbym podać nieco więcej informacji niż tylko String do wyświetlenia w QListView - w zasadzie nazwa pozycji pogrubioną czcionką, poniżej dwóch linii z opisem w innym stylu, a po lewej stronie zestaw tagów odznaki. Co więcej, lista będzie musiała być aktualizowana co kilka sekund (najprawdopodobniej z tylko zmianami do bardzo niewielu pozycji), więc nie chcę przepisywać danych za każdym razem.Niestandardowe elementy w QListView

Z tego, co przeczytałem w różnych podręcznikach i samouczkach, można to osiągnąć na różne sposoby i nie jestem pewien, jaka jest najczęściej używana metoda (inne osoby będą musiały pracować z kodem po opracowaniu rdzenia app) - jakich obiektów i metod używałbyś - QListView lub QListWidget, a następnie podklasy QAbstractListModel lub QStandardItemModel, ...?

Odpowiedz

4

Jeśli nie chcesz myśleć o swoim modelu lub naprawdę udostępniasz go pomiędzy widokami, to do tego celu służy QListWidget. Po prostu radzisz sobie bezpośrednio z Listą, a dane są przechowywane w jej własnym modelu podstawowym. W przypadku QListWidget można użyć: QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) Wymagałoby to utworzenia własnego widgetu, który wygląda tak, jak chcesz, mając QLabels do wyświetlania tekstu i pikseli. Następnie należy dodać je do QListWidget wykonując:

# 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) 

Plusem jest to, że można kontrolować wygląd elementów całkiem po prostu, bez konieczności pisania bardziej skomplikowany delegata. Wadą tego podejścia jest to, że nie udostępniasz modelu z innym widokiem i musisz zarządzać tworzeniem widgetów, gdy musisz dodać nowe elementy. Ta metoda zakłada, że ​​wyświetlanie widgetów będzie statyczne. Nie lubią być zmieniane po ich ustawieniu. Może być wolniejsze, jeśli masz ich tysiące.

Tworzenie Delegat przedmiotów w QListView jest szybsze podejście z punktu widzenia wydajności, ale trochę bardziej techniczny ...

Zobacz tutaj na przykład (choć jej w C++, ale łatwo zrozumieć http://www.qtcentre.org/threads/27777-Customize-QListWidgetItem-how-to?p=131746#post131746

Innym przykładem w Pythonie, jeśli kod nie ma wcięcia zakładka: http://www.qtcentre.org/archive/index.php/t-31029.html

2

Jeśli użytkownicy nie dokonują ręcznej zmiany danych na liście wiadomości e-mail, można łatwo użyć jednej z klas modeli z niestandardowym QStyledItemDelegate (lub QAbstractItemDelegate). Spójrzmy na przykład w powyższej dokumentacji QAbstractItemDelegate, a także na przykład Star Delegate.

Jeśli użytkownicy muszą zmienić dane w linii na liście wiadomości, a lista wiadomości e-mail jest wystarczająco różna od standardowych widżetów, staje się nieco trudniejsze upewnienie się, że edytor wygląda wystarczająco podobnie do widok prezentacji. To nie jest niemożliwe, ale to jeden z trudniejszych kawałków.

Możesz uciec, używając QStandardItemModel. Ale ... Generalnie zalecam tworzenie modelu domeny z Qt (w twoim przypadku, QAbstractListModel) do wszystkiego, co nie jest trywialne.

+0

Niektóre z przewidzianych linki są martwe – user1767754

Powiązane problemy