2011-11-23 23 views
5

Sono (molto) nuovo a PyQT e QT in generale e devo progettare rapidamente un'interfaccia utente che è in linea di massima simile alle moderne app di posta a 2 riquadri: ha lasciato un elenco di mail, giusto un editor. Mi piacerebbe dare un po 'di informazioni in più di una semplice stringa da visualizzare nel numero QListView - in pratica il nome degli elementi in grassetto, sotto due righe con descrizione in uno stile diverso, e in alto a sinistra un insieme di tag distintivi. Inoltre, l'elenco dovrà essere aggiornato ogni pochi secondi circa (probabilmente con solo modifiche a pochissimi elementi), quindi non voglio riscrivere i dati ogni volta.Elementi personalizzati in QListView

Da quello che ho letto nei vari manuali e tutorial, ci sono diversi modi per realizzarlo, e non sono sicuro di quale sia il metodo più comunemente usato (le altre persone dovranno lavorare con il codice una volta che ho redatto il core app) - quali oggetti e metodi useresti - QListView o QListWidget e quindi sottoclassi QAbstractListModel o QStandardItemModel, ...?

risposta

4

Se non vuoi pensare al tuo modello, o veramente condividere è tra le viste, allora un QListWidget è pensato per quello scopo. Hai appena a che fare con la lista direttamente e i dati sono memorizzati nel suo modello sottostante. Per un QListWidget, è possibile utilizzare: QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) Ciò comporterebbe la creazione di un proprio widget che appare nel modo desiderato, con QLabels per la visualizzazione di testo e pixmap. Poi si dovrebbe aggiungere alla QListWidget facendo:

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

Il lato positivo è che è possibile controllare l'aspetto degli elementi abbastanza semplice, senza dover scrivere un delegato più complicato. Lo svantaggio di questo approccio è che non si condivide realmente il modello con un'altra vista e si deve gestire la creazione di widget quando è necessario aggiungere nuovi elementi. E questo metodo presuppone che le visualizzazioni del widget siano statiche. A loro non piace essere cambiato dopo che sono stati impostati. Può anche essere più lento se ne hai migliaia.

Creazione di un delegato per i tuoi articoli in un QListView è un approccio più velocemente da un punto di vista delle prestazioni, ma un po 'più tecnico ...

Vedi qui per un esempio (anche se la sua in C++, ma facile da capire http://www.qtcentre.org/threads/27777-Customize-QListWidgetItem-how-to?p=131746#post131746

Un altro esempio in python, se il codice non ha trattino tab: http://www.qtcentre.org/archive/index.php/t-31029.html

2

Se gli utenti non modificano manualmente i dati nell'elenco di messaggi, è possibile utilizzare facilmente una delle classi modello con un numero personalizzato QStyledItemDelegate (o QAbstractItemDelegate). Guarda l'esempio nella documentazione QAbstractItemDelegate collegata sopra e l'esempio Star Delegate.

Se gli utenti devono modificare i dati in linea nell'elenco di posta e l'elenco di e-mail è sufficientemente diverso dai widget standard, diventa un po 'più difficile assicurarsi che l'editor sia sufficientemente simile a la vista della presentazione. Non è impossibile, ma è uno dei pezzi più difficili.

Si può ottenere usando QStandardItemModel. Ma ... In genere consiglio di creare un modello di dominio con un wrapper Qt (nel tuo caso, QAbstractListModel) per qualcosa di non banale.

+0

Alcuni dei link forniti sono morti – user1767754

Problemi correlati