[gelöst] Probleme mit QScrollArea
[gelöst] Probleme mit QScrollArea
Hallo zusammen,
Auf mehrere Wege habe ich versucht QScrollArea zu verwenden, bisher erfolglos. Es treten jeweils unterschiedliche Probleme auf.
Wenn ich vorgehe wie im "Qt 4.7: Image Viewer Example" (sprich: QMainWindow enthält eine QScrollArea als CentralWidget, welche das eigentliche QWidget beinhaltet) ist es mir nicht mehr möglich während der Laufzeit Layouts mit weiteren Widgets meinem Widget hinzuzufügen. Nach resize(500,500) lässt sich hier scrollen.
Ein anderer Versuch war mein Hauptwidget direkt von QScrollArea erben zu lassen, mit setBackgroundRole und setAutoFillBackground musste ich Hintergrundtransparenz verhindern (man konnte durch den Hintergrund durchklicken). Der selbe Code funktioniert (Layouts lassen sich hinzufügen), allerdings ohne Scroll-Funktion.
Gilt es hier etwas grundsätzliches zu beachten?
Auf mehrere Wege habe ich versucht QScrollArea zu verwenden, bisher erfolglos. Es treten jeweils unterschiedliche Probleme auf.
Wenn ich vorgehe wie im "Qt 4.7: Image Viewer Example" (sprich: QMainWindow enthält eine QScrollArea als CentralWidget, welche das eigentliche QWidget beinhaltet) ist es mir nicht mehr möglich während der Laufzeit Layouts mit weiteren Widgets meinem Widget hinzuzufügen. Nach resize(500,500) lässt sich hier scrollen.
Ein anderer Versuch war mein Hauptwidget direkt von QScrollArea erben zu lassen, mit setBackgroundRole und setAutoFillBackground musste ich Hintergrundtransparenz verhindern (man konnte durch den Hintergrund durchklicken). Der selbe Code funktioniert (Layouts lassen sich hinzufügen), allerdings ohne Scroll-Funktion.
Gilt es hier etwas grundsätzliches zu beachten?
Zuletzt geändert von schwer am 10. Dezember 2010 18:32, insgesamt 1-mal geändert.
Code: Alles auswählen
QApplication a(argc, argv);
QGroupBox box("MyBox"); // dein QWidget = W
QGridLayout boxLay(&box); // das Layout = L
for (int i=0; i < 100; ++i)
boxLay.addWidget(new QLabel(QString::number(i)+ ". ganz langes Label das nix kann")); // deine W_1...W_100
QScrollArea area; // dein S
area.setWidget(&box); // nimmst W als child
area.show();
return a.exec();
Dieses Wiget setzt du (S) (deinem QScrollArea) mittels QScrollArea::setWidget() als child für die Scrollarea.
Jedesmal wenn du in L was reinstopfst (sei es Widget oder ein Layout das widgets enthält wird automatisch die SizeHints von W angepasst, überschreiten die die Größe von W die aktuelle von S dann werden scrollers angezeigt. Konsequente Nutzung von Layouts ist hier das Stichwort!
Es werden hinzugefügte Layouts mit QPushButtons noch immer nicht angezeigt. Darf innerhalb einer QScrollArea nur noch QGridLayout verwendet werden? Oder gibt es andere Einschränkungen?
Meine Layouts:
[grid]
[vbox a]
[hbox]btn1,btn2[/hbox]
[hbox]spacerItem[vbox b]btnX,btnY..[/vbox][/hbox]
[/vbox]
[/grid]
In [vbox b] folgt nach klickt auf btnX wieder [vbox a], das ganze funktioniert solange es sich nicht in einer QScrollArea befindet. Ansonsten habe ich den Aufbau deiner Schilderung angepasst. (Scroll>Group>Grid>vbox a)
Edit: Buchstabe und Danke vergessen.
Edit: Ich habe QtCreator 2.0.1, Qt 4.7.0 . Könnte dies mein Problem sein?
Meine Layouts:
[grid]
[vbox a]
[hbox]btn1,btn2[/hbox]
[hbox]spacerItem[vbox b]btnX,btnY..[/vbox][/hbox]
[/vbox]
[/grid]
In [vbox b] folgt nach klickt auf btnX wieder [vbox a], das ganze funktioniert solange es sich nicht in einer QScrollArea befindet. Ansonsten habe ich den Aufbau deiner Schilderung angepasst. (Scroll>Group>Grid>vbox a)
Edit: Buchstabe und Danke vergessen.
Edit: Ich habe QtCreator 2.0.1, Qt 4.7.0 . Könnte dies mein Problem sein?
Äh - wieso sollte das so sein? Das war nur ein Beispiel. Du kannst jedes Layout in eine ScrollArea stopfen, auch ein eigenes. Du darfst sogar auf Layouts verzichten - wenn du weißt was du tustschwer hat geschrieben:Darf innerhalb einer QScrollArea nur noch QGridLayout verwendet werden? Oder gibt es andere Einschränkungen?
![Razz :P](./images/smilies/icon_razz.gif)
Entscheidend bei der ScrollArea-Sache ist der Aufbau. Du setzt nicht das Layout in die ScrollArea (was viele gern machen
![Razz :P](./images/smilies/icon_razz.gif)
Ich würde sagen, es ist an der Zeit Code zu posten. Zeig uns was du hast, wir sagen dir warum es nicht geht
![Smile :)](./images/smilies/icon_e_smile.gif)
Grüßle und schönes Tauwetter allerseits
QWidget fehlt nicht wirklich. Habe es nur vergessen zu erwähnen. Ich habe mich an dein Beispiel gehalten (ScrollArea > GroupBox > GridLayout > VBoxLayout).
Ich musste nur wenige Zeilen ändern. Mich verwirrt die Tatsache das mein QWidget funktioniert solange es nicht in einer ScrollArea ist. Ich werde Versuchen mit möglichst wenig Code das Problem zu rekonstruieren. Vielleicht lässt sich dann das Problem finden.
Ich musste nur wenige Zeilen ändern. Mich verwirrt die Tatsache das mein QWidget funktioniert solange es nicht in einer ScrollArea ist. Ich werde Versuchen mit möglichst wenig Code das Problem zu rekonstruieren. Vielleicht lässt sich dann das Problem finden.
Es wäre zumindest eine Erklärung. In HTML sind solche Einschränkungen schliesslich auch vorhanden, wenn auch in anderem Kontext (de.selfhtml.org: "Das <p>-Element darf keine anderen blockerzeugenden Elemente wie z.B. Überschriften, Textabsätze oder Listen enthalten."). So abwegig war mein Gedanke wohl nicht.franzf hat geschrieben:Äh - wieso sollte das so sein?
Ich habe nun ein Beispiel geschrieben.
In main.cpp kann if(true), mit ScrollArea, zu if(false), nur QWidget, gewechselt werden. if(false) zeigt dass es ohne QScrollArea funktioniert.
Das Beispiel zeigt zehn Buttons welche bei klick jeweils zehn weitere Buttons unter sich eingerückt einreihen, selbes gilt für diese Buttons. Beim klick wird zudem ein Button ("pop") sichtbar, er hat keine Funktion, zeigt aber zumindest dass geklickt wurde.
In main.cpp kann if(true), mit ScrollArea, zu if(false), nur QWidget, gewechselt werden. if(false) zeigt dass es ohne QScrollArea funktioniert.
Das Beispiel zeigt zehn Buttons welche bei klick jeweils zehn weitere Buttons unter sich eingerückt einreihen, selbes gilt für diese Buttons. Beim klick wird zudem ein Button ("pop") sichtbar, er hat keine Funktion, zeigt aber zumindest dass geklickt wurde.
- Dateianhänge
-
- ScrollTest.zip
- Das Archiv enthält mywidget.h/.cpp, inside.h/.cpp, main.cpp und ScrollTest.pro
- (1.99 KiB) 229-mal heruntergeladen