Custom item view

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hallo Leute,

nach fast 4 Jahren C#/WPF bin ich etwas aus der Übung in Qt. Daher bitte ich um Nachsicht, falls mein Anliegen unsinnig ist.

MVC: QStandardItem + QListView + QStandardItemModel
Via QItemDelegate lässt sich das Aussehen des Items im View überschreiben. So weit, so gut.

Nun will ich gern einen "custom" View erzeugen, ähnlich einem QTreeView, allerdings statt "normalen" Items sollen custom Widgets dargestellt sein. Ein Item diesen Typs sieht zum Beispiel so aus:

QCollapsableGuiItem(QFrame)
-------------------------------------------------------------
| > Icon1, Icon2 ItemText Button1 Button2 |
-------------------------------------------------------------
| ChildItem 1 |
-------------------------------------------------------------
| ChildItem 2 |
-------------------------------------------------------------

Meine bisherigen Versuche endeten damit, dass ich eine Klasse QCustomItemView erstellt habe, die SetModel() zur Verfügung stellt. Wenn nun ein Item zum Model hinzugefügt wird, wird der View benachrichtigt, erzeugt ein neues QCollapsableGuiItem und fügt es dem Layout einer QScrollArea hinzu. Analog funktioniert das Ganze für das Entfernen eines Items im Model.

In WPF hätte ich einfach ein ItemControl verwendet und das ItemControlTemplate entsprechend deklariert. Bei Änderungen des Models muss ich da nicht explizit ans Layout ran, der View kümmert sich um die Data->UI population.

Meine Frage ist nun, ob das obige der richtige Weg ist, oder ob jemand eine bessere Alternative weiß. Über QItemDelegate scheint das Geforderte nicht umsetzbar zu sein, jedenfalls sah ich bisher keine Möglichkeit wirkliche QWidgets im View anzuzeigen.
Ich bin für jeden Hinweis dankbar. Vielleicht wurde so etwas in der Art schon an andere Stelle diskutiert. Ich konnte allerdings nichts finden, möglicherweise habe ich die diversen Suchmaschinen mit den falschen Keywords gefüttert!?

Sollte etwas unklar sein, bitte einfach melden. Ich kann ggf. Code zur Verfügung stellen, das wäre dann allerdings C++.

Besten Dank fürs Lesen.
Grüße, Mad
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Madmartigan:
Wenn ich Dich richtig verstehe, willst Du ja nur die Items anders darstellen als beim Standard-TreeView, brauchst also eigentlich keine Modifikationen am Itemcontainer. Das sollte wahlweise per Delegate funktionieren (über die paint-Methode) oder bei statischem Inhalt auch einfacher über QAbstractItemView::setIndexWidget.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hi jerch, danke für deine Antwort.
Ich hab mich jetzt etwas länger damit auseinander gesetzt und bin zur Erkenntnis gekommen, keinen Delegaten zu verwenden. Das Aussehen kann man damit prima verändern, allerdings taugt das wirklich nur für die Item-Darstellung, nicht um komplexere Widgets in einem View anzuzeigen. Jedenfalls ist mir das nicht gelungen und das Web bringt auch nichts Gescheites bei der Suche.

Meine Lösung schaut jetzt wie folgt aus: Ich verwende ein eigenes Datenmodel (erbt von QAbstractItemModel), das potentielle Views bei Änderungen jedweder Art via Signal/Slot informiert. Mein View ist eine eigene Klasse (erbt von QScrollArea) und fügt neue Items entsprechend den Model-Änderungen automatisch zu seinem Container hinzu. (Und löscht sie natürlich auch wieder bei Aufforderung). Eine alphabetische Sortierung funktioniert ebenso, auch mit Invertierung. Was noch fehlt ist Drag&Drop Unterstützung.

Ist sicherlich nicht die eleganteste Variante, aber der View ist so abstrakt gehalten, dass ich jedes beliebige Widget in die Liste packen kann, der View weiß nichts vom Inhalt seiner Items. Damit habe ich einen wiederverwendbaren (List-)View für beliebige Items.

Wenn dennoch jemand andere Ideen hat, wäre ich sehr daran interessiert. :)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Madmartigan:
Jupp die Delegates sind recht beschränkt in der "Überladung" und eigentlich nur für die Präsentation des Iteminhaltes gedacht. Wenn da deutlich mehr rein soll, könnte man zwar mit Umbiegen der Painterreferenz das erreichen, hat dann aber sehr unschönen Code "Monkeypatch"-Code, der auch nicht mehr besonders OOPig ist.
Ich wäre trotzdem mal am Code interessiert, z.B. würde mich interessieren, wie Du das "View-Interface" realisiert hast, da Du ja nicht von QAbstractItemView abgeleitet hast.
Antworten