[PyQt4] Icons in QListView

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

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? :?:
Zuletzt geändert von Kelhim am Samstag 14. März 2009, 20:21, insgesamt 1-mal geändert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Qt kennt etliche "Zeichnenklassen", für Icons schau doch mal unter QPixmap() und QIcon().
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.
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

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. :?
lunar

In dem du ein eigenes Model implementierst, dass von QAbstractListModel ableitet und ".data()" entsprechend überschreibt. Ich habe mal ein ziemlich einfaches Beispiel zusammengeschrieben ...
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

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()
Antworten