[Gelöst] QScrollArea zeigt keine Scrollbars ein



  • Ich habe eine QScrollArea im Designer von Qt Creator erstellt.
    Qt Creator erstellt mir gleich ein QWidget namens scrollAreaWidgetContents mit.

    Nun hab ich folgenden Code:

    for (int i=0;i<50;i++)
    {
      QLabel* testLabel=new QLabel("test\ntest\ntest",ui->scrollAreaWidgetContents);
      testLabel->setGeometry(QRect(10+i*80,10,80,50));
    }
    

    Die passen natürlich nicht alle da rein, trotzdem wird keine Scrollbar angezeigt.
    Das Herumspielen an der sizePolicy von scrollAreaWidgetContents hat auch keinen Erfolg gebracht, lediglich wenn ich minimumSize.width auf einen hohen Wert setze, bekomme ich endlich eine Scrollbar. Aber ich möchte nicht jedes Mal selbst ermitteln, wie viel Platz ich für die Widgets gerade benötige. Ich denke, das ist auch nicht so vorgesehen und sollte normalerweise automatisch passieren.
    Was habe ich übersehen?



  • Du hast übersehen, dass sich ein Widget nicht automatisch vergrößert, nur weil es children hat die zusammen größer sind als das parent. Verwende ein QHBoxLayout. Ein Layout sorgtfür eine automatische Größenanpassung des parent-Widgets (wenn möglich).

    So statisch positionierte Widgets sind immer Mist, weil nicht jeder User einen Monitor mit gleicher Auflösung, deine Schriftart und auch nicht deinen Style hat.



  • Hm. Ja, ich weiß, dass feste Größen in vielen Situationen suboptimal sind, aber für diesen Anwendungsfall wären feste Größen in Ordnung.

    Ich habe jetzt in scrollAreaWidgetContents ein QHBoxLayout eingefügt und entsprechend

    ui->horizontalLayout->addWidget(testLabel);
    

    zum Code hinzugefügt. Das Ergebnis ist das:
    http://94.23.22.190/tetete.png

    l'abra d'or schrieb:

    Ein Layout sorgtfür eine automatische Größenanpassung des parent-Widgets (wenn möglich).

    Scheinbar hängt es genau daran. Die QScrollArea müsste eine Scrollbar anzeigen, wenn scrollAreaWidgetContents größer als die Area selbst ist. Nur wird scrollAreaWidgetContents eben nie größer, außer man setzt minimumSize entsprechend. Selbst manuelle setGeometry-Aufrufe werden ignoriert und welchen Wert maximumSize.width und sizePolicy hat, scheint dem Widget auch egal zu sein. scrollAreaWidgetContents bleibt stur auf seiner Breite von 969 Pixel.



  • Wenn möglich sollte nur heißen: Ist das parent selber in einem Layout "eingesperrt" (oder verbietet per SizePolicy die Änderung der Größe), so kann das gesetzte layout das parent nicht verändern.
    Und dein Codeausschnitt bringt rein gar nix, weil nicht ersichtlich ist wie du Widgets hinzufügst und wie das "ui->horizontalLayout" mit der ScrollArea in Verbindung steht.
    Prinzipiell:

    ScrollArea
        +- widget()
              +- layout()
                     +- addWidget(w1)
                     +- addWidget(w2)
                     +- addWidget(w3)
                     +- addWidget(w4)
                     +- .....
    

    Und wenn du dem scrollArea->widget(), dem layout oder den anderen Widgets nicht irgend etwas komisches befiehlst (via SizePolicy etc), wird das auch wunderbar funktionieren.



  • Im Designer wird die Hierarchie so angezeigt, wie du sie skizziert hast. Wenn man sich den dazu generierten Code ansieht, ist zwischen widget() und layout() noch ein horizontalLayoutWidget.
    Das erscheint mir nicht besonders sinnvoll, aber wenn man es entfernt, funktioniert tatsächlich alles wie gewünscht. Danke für die Hilfe 👍


Anmelden zum Antworten