Seite 1 von 1

PyQt4 - Menü wie in Kopete-Settings

Verfasst: Montag 2. März 2009, 20:15
von Kelhim
Hallo - ich würde gerne mit PyQt4 ein Menü wie dieses hier ganz links in den Kopete-Einstellungen verwenden, finde aber keine Klasse in der Doku. Ich kann mir irgendwie nicht vorstellen, dass ich so etwas selber bauen muss. Nachdem ich mich dort dusselig gesucht habe, hoffe ich hier auf Hilfe!

Verfasst: Montag 2. März 2009, 20:58
von C4S3
Sieht aus wie ein QIconView, finde ich.

Verfasst: Mittwoch 4. März 2009, 14:48
von jerch
QIconView gibt es nicht mehr in PyQt4, glaub ich.
Den View solltest Du mit einem QListView mit viewMode = iconMode umsetzen können. (Im Zweifelsfalle müßtest Du das mal in den Kopetequellen nachschlagen)

Verfasst: Sonntag 8. März 2009, 14:56
von Kelhim
Vielen Dank für die Antworten! Es ist, wie jerch schreibt, man kann so etwas mit QListView oder QListWidget umsetzen. Ich habe mich für QListView entschieden, weil ich gerne HTML in den Item-Strings der Liste interpretiert haben möchte. Das könnte ich vielleicht auch mit QListWidget über Style Sheets erreichen, aber ich bastele gerade ein bisschen zur Übung. ;)

Ein wichtiger Teil fehlt mir nun noch für das Menü: Icons - da könnte ich einen Tipp gebrauchen! ;)

Verfasst: Sonntag 8. März 2009, 16:38
von jerch
Wenn Du eigentlich nur die Kopetesache "nachbauen" willst, warum dann das Rad neu erfinden? Mit QListWidget bringt Qt da doch schon alles nötige mit (ist ja auch von QListView abgeleitet). QListWidgetItem hat den Icon-Support an Board.
Und eine fehlende Funktionalität in QListWidgetItem hast Du wahrscheinlich schneller in einer hiervon abgeleiteten Klasse hinzugefügt als die Hälfte von QListWidget und QListWidgetItem nachimplementiert.
Just my 2 cents.

Verfasst: Samstag 14. März 2009, 20:20
von Kelhim
Jetzt habe ich die Menü-Bar genau so, wie ich sie haben wollte: Die minimale Größe der View leitet sich von der Größe der Items darin ab - wenn die View aber vergrößert wird, "wachsen" die Items horizontal oder vertikal (je nach Flow) mit, sodass die Liste immer gänzlich mit Items ausgefüllt ist. Außerdem hat jedes Item die größte Breite bzw. Höhe (wieder je nach Flow), die in der gesamten Liste auftaucht.

Habe da mit QListView.resizeEvent(), QStyledItemDelegate.sizeHint() und einer eigenen Methode im Delegate, die alle Item-Größen in einem Dictionary sammelt, gespielt.

Ärgerlich war nur die Tatsache, dass QWidget.setStyleSheet() oder irgendeine der darin aufgerufenen Methoden einmal sizeHint() des Delegates aufruft und mir also zuerst die unformatierten Items (nicht bold, kleiner Schriftgröße) mit dementsprechend kleineren Größen zurückgab. Bis ich das einmal herausfand, hatte ich schon die Qt-Source-Dateien nach einem Hinweis durchsucht.

Das alles konnte ich nicht mit einem ListWidget erreichen, zumindest weiß ich nicht, wie. Und als Einstieg ins Model-/View-Konzept war es ganz brauchbar.

Naja, so sieht's aus: Bild 1 Bild 2 Bild 3 Bild 4