[gelöst] Auf Veränderung der Fenstergröße reagieren

Alles rund um die Programmierung mit Qt
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

[gelöst] Auf Veränderung der Fenstergröße reagieren

Beitrag von jerry42 »

Hallo zusammen,

ich hab ein kleines (oder vielleicht auch großes) Problem mit Qt.
Ich benutze Qt 4.4.3 auf OpenSuse 10.3.

Mein Ziel ist es eine Übersichtsdarstellung von Bildern zu realisieren. Also eine Ansicht mit vielen kleinen Vorschaubildern die in einem Grid dargestellt werden. Man kann sich das ganze wie im Windows Explorer vorstellen.
Ein gutes Beispiel für das Scrollverhalten findet sich auch auf youtube:
http://de.youtube.com/watch?v=kVcTMAUr3Bw&NR=1

Das ganze soll wenn nötig vertikal gescrollt werden.
Wenn die Fenstergröße verändert wird, dann dürfen pro Zeile weniger Bilder angezeigt werden und somit muss das ganze nach unten länger werden.

Da ich es bisher so verstanden habe, dass ich im GridLayout immer die explizite Zelle angeben muss, in die ich Einfügen will, muss ich die Anzahl der Bilder die in eine Reihe passen selber berechnen. Es gibt also wohl kein Konstrukt dem ich einfach die verschiedenen Items übergeben kann, und das sich dann allein um die Anzeige kümmert. Das wäre auch zu schön gewesen. (Falls ich hier falsch liege, bitte schreien :)

Also muss ich die Setzung der Items selbst übernehmen und damit muss ich mitbekommen, wenn der Benutzer die Fenstergröße ändert um dann die Aufteilung neuberechnen und neu zeichnen zu können.

Doch ich finde weder in QMainWindow noch in QWidget ein entsprechendes Signal, dass mir darüber Aufschluß geben würde.

Wie kann ich das ganze realisieren?
Mein bisheriger Ansatz in eine QGraphicsView mit QGraphicsScene und darin ein QGraphicsGridLayout. Sollte funktionieren, aber ich muss es halt selbst berechnen.

Vielen Dank im Voraus für alle Tipps.

Viele Grüße
jerry42
Zuletzt geändert von jerry42 am 23. Oktober 2008 13:15, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Du Willst für jedes Bild ein Label nehmen???? Und das dann einzeln an ein Widget klatschen????

Dasgeht aber auch schöner.... oder spezielle Gründe warum so, falls so?!
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Nein, muss nicht so sein. :)
Bin neu bei Qt und das war die erste Lösungsvariante die mir eingefallen ist.

Welchen Weg würdest du gehen?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

übern Icon View?
Also mach die ein Listview in dein Widget, packs in ein Layout, dann setz dein ListView auf "ViewMode" IconMode und füge dir Icons hinzu
Qt applications should use QListWidget or its base class QListView instead, and call QListView::setViewMode(QListView::IconMode) to obtain an "icon view" look.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Vielen Dank für den Tipp. Werds mir auf jeden Fall genauer anschauen.

Kann ich dabei auch die Bilder einrahmen für Selektion und zum Beispiel Checkboxen an jedes Bild kleben? Und zum Beispiel den Namen des Bildes?


Wie man auf die Änderung der Fenstergröße reagieren kann, würde mich aber dennoch weiterhin interessieren, falls das jemand weiß?!

Gruß jerry42
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Alternativ kannst auch ein QTableWidget nehmen und dort Items hinzufügen. Diese können auch Icons sein. Die können einen Checkstate haben und einen Text mit übergeben bekommen.

Zum Resize:
oid QWidget::resizeEvent ( QResizeEvent * event ) [virtual protected]
This event handler can be reimplemented in a subclass to receive widget resize events which are passed in the event parameter. When resizeEvent() is called, the widget already has its new geometry. The old size is accessible through QResizeEvent::oldSize().
The widget will be erased and receive a paint event immediately after processing the resize event. No drawing need be (or should be) done inside this handler.
See also moveEvent(), event(), resize(), QResizeEvent, paintEvent(), and Scribble Example.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Danke Dir.

Wobei ich wohl nur in der IconView um das manuelle Setzen meiner Items herumkomme, oder?

Gruß jerry42
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Wie meinst du das?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Naja im QTableWidget muss ich ja auch sagen in welche Zelle ich das Item gern hätte.
void setItem ( int row, int column, QTableWidgetItem * item )

Wenn ich es richtig verstanden habe kann sich die IconView selbstständig um die Platzierung auf dem ihr zur Verfügung stehenden Platz kümmern, oder nicht?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

so gesehen ja....

aber wozu gibts denn funktionen ;-)

kannst dir auch für die Tabelle ne doppelte schleife bauen die von 0... spalten und von 0..zeile geht und immer weiter einfügt...

also dir stehen alle möglichkeiten offen
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Ja das Befüllen ist natürlich kein Problem. Mir liegt mehr die automatische Reorganisation während der Veränderung der Fenstergröße im Magen. Ob so eine ständige Neuberechnung auf die Performance geht?
Wenn bei 20-30 Bildern (relativ große) die Performance keine Rolle spielt, macht es natürlich nichts aus es neuzuberechnen.

Danke für deine Hilfe.

Viele Grüße
jerry42
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

musst du ja nicht machen ;-) also das neu berechnen. Das macht qt schon für dich.

von daher ausprobieren und gucken was es kostet ;-)
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Wenn ich einfach nur die Fenstergröße ändere, macht Qt natürlich das für mich.

Was ist aber wenn ich verhindern will, dass ein horizontaler Scrollbalken entsteht. Dann muss ich doch z.B. Spalte 4-6 löschen und mehr Zeilen hinzufügen. Das wird Qt wohl nicht für mich übernehmen, oder etwa doch?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

kann ich dir nicht sagen ob das qt automatisch macht. du kan nst aber du scrollbalken deaktievieren. schau doch mal in der doku. dann probier aus und gib bescheid!
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Also weder QTableWidget noch eine QGraphicsView mit entsprechendem QGraphicsGridLayout macht diese Anpassung bei ausgestellten Scrollleisten automatisch.
Schade eigentlich, hätte das als doch durchaus nicht zu seltenes Anwendungsszenario gesehen.

Werd mich wohl für das QTableWidget entscheiden, das sieht bisher doch sehr vernünftig und für meine Zwecke ausreichend aus.

Ich habe nun das Bild als entsprechend großes QIcon dem QTableWidgetItem hinzugefügt.

Muss ich das QTableWidgetItem überschreiben, wenn ich gern dieses CheckState-Checkbox oder den Text unterhalb vom Bild haben will?
Kannst du mir da noch nen Tipp geben. Das ist dann auch die letzte Folgefrage. Ich versprechs ;)
Antworten