2016-07-11 3 views
0

Ich füge dynamisch Widgets in einer QScrollArea hinzu und möchte maximal vier Widgets gleichzeitig anzeigen, bevor die Bildlaufleiste angezeigt wird. Also, im Grunde, wenn ich 0-3 Widgets habe und ich ein anderes hinzufüge, wird der Bildlaufbereich auf die neue Höhe angepasst, danach bleibt die Höhe auf der 4 Widgets Größe und man muss blättern, um den 5., 6., ...Qt: Größe von QScrollArea so ändern, dass maximal 4 Widgets angezeigt werden

Derzeit rufe ich die folgende Methode auf, wenn ein Widget eingefügt/entfernt wird.

void WidgetList::resizeScrollArea() 
{ 
    // height of the first four widgets 
    int widgetsHeight = 0; 
    for (int i = 0; i < _widgets.size() && i < 4; ++i) 
    { 
     // height of a widget 
     widgetsHeight += _widgets.at(i)->sizeHint().height(); 
    } 
    // some leeway to make sure we have some gap between the widgets 
    _ui->scrollArea->setFixedHeight(widgetsHeight + 5); 
} 

Das Problem ist, dass sizeHint() ist nicht immer die richtige Höhe (manchmal zu groß), aber weder ist size() (oft zu klein). Daher ist mein Bildlaufbereich oft etwas zu groß für den Inhalt, aber manchmal funktioniert es.
Nicht alle meine Widgets haben die gleiche Höhe, und manchmal scheint sizeHint die richtige zu sein, und manchmal ist es Größe.
Ich verstehe sizeHint ist die Größe, die das Widget haben möchte, nicht die, die das Layout ihm gibt, aber ich verstehe nicht, warum die Größe inkorrekt ist.

Jede Idee, wie ich es tun sollte, würde am meisten geschätzt werden.

+0

Werfen Sie einen Blick auf [diese Antwort] (http://stackoverflow.com/a/21265287/1329652). –

Antwort

0

Anstatt feste Höhe einzustellen, sollten Sie sizeHint() überschreiben, um die Größe zurückzugeben, die Ihr Widget sein möchte (so dass ein Layout etwas mehr oder etwas weniger geben könnte, wenn es nötig ist). Sie möchten invalidate() aufrufen, wenn eines dieser ersten vier untergeordneten Widgets geändert wird, um dem enthaltenden Layout mitzuteilen, dass alle vorherigen zwischengespeicherten Werte neu berechnet werden sollen.

Und wenn Ihre Widgets alle in einer QVBoxLayout sind (ich vermute, aber scheint vernünftig zu sein), dann sollten Sie seinen Abstand und oberen Rand in Ihrer Berechnung abrufen.