Seite 1 von 1

[gelöst] Probleme mit QScrollArea

Verfasst: 6. Dezember 2010 20:45
von schwer
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?

Verfasst: 6. Dezember 2010 22:37
von padreigh

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();
Du brauchst ein QWidget (W), das kriegt ein Layout (L), dem Layout kannst du andere Widgets(W_1...W_n) oder andere Layouts (L_1,...,L_m) adden (addWidget(),addLayout()).
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!

Verfasst: 6. Dezember 2010 23:50
von schwer
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?

Verfasst: 7. Dezember 2010 00:13
von kater
@padreigh
Danke fürs Beispiel. Hab das mit dem QScrollArea auch noch nie hinbekommen.

Verfasst: 7. Dezember 2010 09:31
von franzf
schwer hat geschrieben:Darf innerhalb einer QScrollArea nur noch QGridLayout verwendet werden? Oder gibt es andere Einschränkungen?
Ä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 tust :P

Entscheidend bei der ScrollArea-Sache ist der Aufbau. Du setzt nicht das Layout in die ScrollArea (was viele gern machen :P), sondern in ein eigenes Widget, welches du der ScrollArea zur Verwaltung übergibst. Das hat ja padreigh schon sehr schön dargelegt.

Ich würde sagen, es ist an der Zeit Code zu posten. Zeig uns was du hast, wir sagen dir warum es nicht geht :)

Grüßle und schönes Tauwetter allerseits

Verfasst: 7. Dezember 2010 17:27
von padreigh
[qwidget] // fehlt
[grid]
[vbox a]
[hbox]btn1,btn2[/hbox]
[hbox]spacerItem[vbox b]btnX,btnY..[/vbox][/hbox]
[/vbox]
[/grid]
[/qwidget] // fehlt

QScrollArea.setWidget(qwidget); // fehlt
(bzw das Widget dann in ein QScrollArea reinziehen - nix Layout dazwischen

Verfasst: 7. Dezember 2010 17:53
von schwer
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.
franzf hat geschrieben:Äh - wieso sollte das so sein?
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.

Verfasst: 7. Dezember 2010 19:25
von schwer
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.

Verfasst: 10. Dezember 2010 18:31
von schwer
Jetzt funktioniert alles ordnungsgemäss. Es fehlte nur der Aufruf von setWidgetResizable(true) für die QScrollArea.
Danke für Eure Hilfe.