2012-12-05 23 views
17

Chciałbym mieć instancję QWidget, która używai (idealnie automatycznie, ale po wywołaniu, jakaś funkcja też jest w porządku) zmienia rozmiar w poziomie, dopasowując ją do zawartości. Zmiana rozmiaru w poziomie jest wystarczająca, ponieważ wszystkie widżety, w tym sam pojemnik, będą miały taką samą wysokość.Widżet Qt o minimalnym rozmiarze, aby zmieścić całą zawartość

Przypadek użycia jest następujący: Widżet, nazwijmy go kontenerem, jest zmienny, tzn. Nie jest częścią żadnego układu. Użytkownik powinien mieć możliwość dodawania kolejnych widżetów o stałym rozmiarze (przez wywołanie funkcji) do układu kontenera, na którym pojemnik rośnie, dopasowując się do nowej zawartości. Użytkownik powinien także mieć możliwość usunięcia wcześniej dodanego widżetu, na którym kontener ponownie się kurczy. Kontener nie zostanie utworzony, dopóki pierwszy widget nie zostanie wstawiony i usunięty po usunięciu ostatniego, tj. Zawsze będzie zawierał co najmniej jeden widget.

Przykład: po dodaniu pierwszej widżet, pojemnik wygląda tak, ze | będąc jej lewym/granice rację:

|<1st widget>| 

Po dodaniu jeszcze jeden, wygląda to tak:

|<1st widget> <2nd, longer widget>| 

Po usunięciu pierwszego widget, wygląda to tak:

|<2nd, longer widget>| 

Podejrzewam, że powinno to być proste, ale zgubiłem się gdzieś pomiędzy kontenerem sizeHint, sizePolicy, adjustSize(), a jego układem jest sizeContraint, jak również kilkoma próbami z wyraźnym ustawianiem rozmiaru i wymuszania aktualizacji i zasadniczo nie osiągnąłem niczego (tj. pojemnik w ogóle nie zmienia rozmiaru, pojemnik tylko rośnie, ale nie kurczy się, itp.). Podejrzewam, że przegapiłem coś oczywistego ...?

Odpowiedz

8

Twoje przypuszczenie jest słuszne. Trzeba ustawić zasady rozmiaru dla widżetów w układzie. Pierwszy widżet powinien mieć QSizePolicy::Minimum, a drugi powinien mieć QSizePolicy::Expanding, aby osiągnąć pożądany efekt. Oto przykładowa aplikacja:

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QPushButton *button1 = new QPushButton("Hello"); 
    button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); 
    QObject::connect(button1, SIGNAL(clicked(bool)), button1, SLOT(hide())); 
    QPushButton *button2 = new QPushButton("World"); 
    button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
    QObject::connect(button2, SIGNAL(clicked(bool)), button2, SLOT(hide())); 

    QHBoxLayout *layout = new QHBoxLayout(); 
    layout->addWidget(button1); 
    layout->addWidget(button2); 

    QWidget main; 
    main.setLayout(layout); 
    main.show(); 

    return a.exec(); 
} 
Powiązane problemy