[gelöst] Probleme mit QScrollArea

Alles rund um die Programmierung mit Qt
Antworten
schwer
Beiträge: 6
Registriert: 6. Dezember 2010 18:51

[gelöst] Probleme mit QScrollArea

Beitrag 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?
Zuletzt geändert von schwer am 10. Dezember 2010 18:32, insgesamt 1-mal geändert.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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!
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
schwer
Beiträge: 6
Registriert: 6. Dezember 2010 18:51

Beitrag 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?
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

@padreigh
Danke fürs Beispiel. Hab das mit dem QScrollArea auch noch nie hinbekommen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
schwer
Beiträge: 6
Registriert: 6. Dezember 2010 18:51

Beitrag 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.
schwer
Beiträge: 6
Registriert: 6. Dezember 2010 18:51

Beitrag 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.
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
schwer
Beiträge: 6
Registriert: 6. Dezember 2010 18:51

Beitrag von schwer »

Jetzt funktioniert alles ordnungsgemäss. Es fehlte nur der Aufruf von setWidgetResizable(true) für die QScrollArea.
Danke für Eure Hilfe.
Antworten