Welches Widget?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ich habe die Vorstellung, dass ich am Ende nicht nur die Daten über QTableView, QListView oder QTreeWidget ausgeben möchte, sondern auch das dazugehörige Cover-Bild. Ihr kennt sicherlich diese Ansicht. Man sieht ein Cover-Bild und darunter den Filmtitel, der von der Datenbank ausgegeben wird. Es kommt hinzu, dass ich die dazugehörigen Cover-Bilder nicht in die Datenbank speichern werde, sondern auf der Schiene des Dateisystems weiterfahren werde. Nun eine Frage an euch, mit welchem Widget kann man die Cover-Bilder gut darstellen? In VB6 musste ich keine Entscheidung treffen, denn dort konnte es nur (also von Haus aus) die ListView. Aber ich denke, die QListView im QT-Designer ist damit nicht zu vergleichen oder? Ich hätte da euren Rat, mit welchem Widget sich die Daten zusammen mit den Cover-Bildern am besten ausgeben bzw. verarbeiten lassen. Zu welchem Zweck eignet sich welches der oben genannten Widgets am besten?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Vor allem ist es mir wichtig zu wissen, mit welchem dieser oben genannten Widget es möglich ist verschiedene Ansichten darzustellen. Mit der ListView aus VB6 konnte man ganze vier Ansichten darstellen. Einmal Details, kleine Symbole, große Symbole und Liste. Mit welchem Widget ist es möglich?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das entscheidene ist doch dabei das Modell. Dort kannst Du diverse Rollen für die Items festlegen, welche dann vom View entsprechend interpretiert werden. Das Konzept wird auch in der Doku genauer beschrieben (Abschnitt über "Item roles").

Auch wenn ich das noch nicht gemacht habe, vermute ich mal stark, dass man eben für verschiedene Darstellungen, die Implementierungen im Modell bezüglich der Rollen ändert. Dies passiert eben über die ``data``-Methode der konkreten Implementierung des QAbstractItemModel (Du kannst evtl. auch von spezialisierteren Modellen erben; etwa dem ``QAbstractListModel`` - je nach Anforderungen!). Je nach Art der Ansicht, muss diese Methode andere Daten liefern, wenn das Framework sie mit den entsprechenden Rollen aufruft.

Evtl. kann man da auch den Decorator- in Kombination mit dem Strategy-Pattern anwenden und einfach je nach Art der Ansicht, ein Dekorator-Objekt über Dein eigentliches Modell legen. Diese rufen zu Teilen die Methoden des Basismodells auf und passen dann in der eigenen ``data``-Methode lediglich die Daten je nach Aufgabe an.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Hyperion,

besten Dank für deine Erklärung. Ich werde mich mal damit näher befassen. Ich habe dir mal ein Bild hochgeladen, damit du so ungefähr eine Vorstellung hast, wie ich es meine. Zum Beispiel wird eine Anfrage gestartet, die Namen der Filme werden ausgegeben, und die dazu gehörigen Cover hinzu. Und genau diese Ansicht hätte ich gerne. Daher war ja meine Frage, ob es überhaupt möglich ist solche eine Ansicht hinzubekommen? Denn in den meisten Tutorials werden einem nur die einseitigen Ansichten dargeboten, und zwar die Ansicht "Detail" oder auch "Report" genannt. Ich konnte nirgend diese Ansicht, die ich mir wünsche, finden. Dabei ist diese Ansicht keineswegs eine Seltenheit oder nur mein spezieller Wunsch. Daher war ich ein wenig irritiert darüber, dass man dazu nichts fand bzw. ich nichts dazu fand. Daher wollte ich wissen, mit welchem Widget man solch eine Ansicht am besten hinbekommen könnte. Soweit ich mich bisher informiert habe, ist diese Ansicht mit QListView nicht möglich, richtig? Da käme wohl eher QtreeWidget in Frage, hmhm?

Bild
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

QTreeView dient der Darstellung hierarchisch organisierter Daten, das wäre sicher nicht die erste Wahl für eine (Film-)Liste.
QListView ist durchaus eine Möglichkeit für dein Vorhaben. Siehe dazu auch QItemDelegate
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Madmartigan: Der Anwender kann ja (Wie Unter Windows auch, wenn er im Explorer unterwegs ist) die Ansichten wechseln. Mal als "Liste", dann als "Detail", dann als "große Symbole" (das wäre dann siehe Abbildung oben) und dann "kleine Symbole". Und Listview kann (entschuldige, wenn cih falsch liege) nur eine Spalte anbieten, richtig? Und bei Filmen wäre bei einer "Detail"-Ansicht mehr als eine Spalte erwünscht. Und da ist wieder TreeWidget wieder gut. Muss ich für jede Ansicht denn ein anderes Widget erzeugen?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Dann würde ich dir eher zu QTableView raten, dort kannst du beliebig viele Spalten und Zeilen ohne großen Aufwand erzeugen. Für eigene Darstellungsformen wie Bilder usw. musst du letzten Endes aber trotzdem einen eigenen Delegaten bauen. Du kannst im QListView den Modus von Report auf Icon umstellen und für beide Ansichten eine unterschiedliche QItemDelegate-Klasse verwenden. Auf diese Art bildest du bereits zwei Ansichten in einem Widget ab.

Unseren ersten Asset-Browser habe ich damals mit Python/Qt geschrieben, und der musste komplexen Anforderungen wie Thumbnails von Texturen und Animationen sowie 3D-RT-Vorschau genügen. Diese Widgets können das also durchaus leisten, ein passendes Datenmodell vorausgesetzt. Aber das wurde ja bereits angesprochen.
QListView bzw. QTableView in Verbindung mit QItemDelegate sind in deinem Fall also eine sehr gute Wahl.

Die Verwendung von QTreeView sehe ich hier immer noch nicht als notwendig/passend an, da eine Liste per se nun mal keine hierarchische Ordnung ist.
Antworten