Seite 1 von 1

[PyQt4] Icons in QListView

Verfasst: Sonntag 8. März 2009, 14:55
von Kelhim
Hallo - um mich etwas in das Model/View-Konzept einzuarbeiten, bastele ich gerade an einer Subklasse von QListView. Bisher hab ich es zumindest ohne Anleitung geschafft, QItemDelegate.sizeHint() so zu bearbeiten, dass die Größe der Liste sich an der Breite bzw. der Höhe des längsten/höchsten Items orientiert.

Ich verstehe nun aber nicht, wie ich diesen Items ein Icon zur Seite stellen kann. Aus der Doku zu QPainter werde ich irgendwie nicht richtig schlau.

Kann mir jemand weiterhelfen? :?:

Verfasst: Sonntag 8. März 2009, 16:28
von jerch
Qt kennt etliche "Zeichnenklassen", für Icons schau doch mal unter QPixmap() und QIcon().

Verfasst: Sonntag 8. März 2009, 17:17
von lunar
Warum implementierst du nicht einfach ein Model, dass für ".data()" ein Icon zurückgibt, wenn der "role"-Parameter Qt.DecorationRole ist?

Für Icons benötigt man eigentlich weder ein Unterklasse von QListView noch einen eigenen Delegate, sondern nur ein eigenes Modell.

Verfasst: Montag 9. März 2009, 15:00
von Kelhim
Dank QTextDocument.setHtml(text) im Delegate kann ich Bilder einfach mit "<img src='/pfad/zum/icon.png'>" hinzufügen. Das wäre die schnelle, unkomplizierte Lösung für mich derzeit.

Ich würde aber gerne lernen, wie es "eigentlich" geht. ;)

@lunar: Die Strings übergebe ich dem Model derzeit als Liste über __init__(). Mir ist aber nicht klar, wie ich da bei Icons vorgehe. :?

Verfasst: Montag 9. März 2009, 16:04
von lunar
In dem du ein eigenes Model implementierst, dass von QAbstractListModel ableitet und ".data()" entsprechend überschreibt. Ich habe mal ein ziemlich einfaches Beispiel zusammengeschrieben ...

Verfasst: Samstag 14. März 2009, 19:41
von Kelhim
Danke, lunar! Mit QPainter hatte ich Anfangserfolge (mir geht's ja vor allem darum, zu lernen), aber das hier ist eindeutig vorzuziehen. ;)

Falls das hier irgendwann jemand nachliest ...

Code: Alles auswählen

#Subklasse von QAbstractListModel

	def data(self, index, role=Qt.DisplayRole):
		if index.isValid():
			name, icon = self.list_[index.row()]
			if role == Qt.DisplayRole:
				return QVariant(name)
			elif role == Qt.DecorationRole:
				return QVariant(icon)
			else:
				return QVariant()
		else:
			return QVariant()