2012-12-11 18 views
5

Chciałbym wymusić rozszerzający przestrzeń w moim QFormLayout, ale bez względu na to, co QFormLayout tylko używa QSpaceItem::sizeHint(). Czy ktoś wie, jak to obejść, lub w jaki sposób poradzić sobie z tym?QSpacerItem W QFormLayout - Vertical Rozwiń


MyWidget::MyWidget(QWidget *parent) : QWidget(parent) 
{ 
    SetupLayout(); 
} 

void MyWidget::SetupLayout() 
{ 
    QFormLayout * layout = new QFormLayout(); 

    layout->addRow("Something1", new QComboBox()); 
    layout->addRow("Something2", new QSpinBox()); 

    //Spacer 
    layout->addItem(new QSpacerItem(0,10, QSizePolicy::Expanding, QSizePolicy::Expanding)); 

    layout->addRow(QPushButton("Something3")); 

    setLayout(layout); 
} 

Odpowiedz

3

Tak było kilka różnych kwestii:

  1. QFormLayout nie rozszerzają się jak inne układy. Moje widżety (kilka z nich) zostały umieszczone w QFormLayout. To uniemożliwiło im ekspansję. Zmieniłem główny układ macierzysty z QFormLayout na QVBoxLayout. To spowodowało, że musiałem użyć QLayout::setAlignment(Qt::AlignTop)
  2. Naprawiono kilka problemów z kilkoma innymi widżetami, które nie zostały rozwinięte. Jednak te widżety używane QVBoxLayout. Powyższy widget używa numeru QFormLayout. Aby uzyskać to rozwijać, musiałem użyć następującą linię w moim QSpacerItem:

QSpacerItem * my_spacer = new QSpacerItem(0,1000, QSizePolicy::Expanding, QSizePolicy::Expanding);


jestem dostarczanie jakiś przykładowy kod. Celem jest pokazanie hierarchii i miejsca, w którym QFormLayout może spowodować problemy.

Przykładowy kod:

//A main Widget class 
void SetupLayout() 
{ 
    QHBoxLayout * main_layout = new QHBoxLayout(); 

    main_layout->addWidget(Some_Widget); 

    //Create a control widget 
    control_widget = new QWidget(); // IMPORTANT control_widget is a member 
    QVBoxLayout * layout = new QVBoxLayout(); //IMPORTANT!!!! - Here it was QFormLayout 

    layout->setAlignment(Qt::AlignTop); //IMPORTANT - Needed this after switching to QVBoxLayout 

    layout->addWidget(new QComboBox("stuff")); //Some combo box 
    control_widget->setLayout(layout); 

    main_layout->addWidget(control_widget); 
} 

//Later on, we have a "Put a new widget in the control area" task 
void NewControlArea() 
{ 
    if(current_control) 
     control_widget->removeWidget(current_control); //current_control is a member variable 

    current_control = new MyWidget(); //FROM ABOVE 
    control_widget->addWidget(current_control); 
} 

Jeśli MyWidget używa QFormLayout, rzeczy nie są rozszerzane chyba dodawać przekładek z nutą wielkości. Jednakże, jeśli MyWidget używa QVBoxLayout, dowolne QWidgets w środku są poprawnie rozwinięte.

0

Podejrzewam, że MyWidget ma niewłaściwy rozmiar. Układ użyje rozmiaru widgetu, aby ustalić, jak najlepiej układać własne elementy. To, że jeden z tych elementów jest ustawiony na zasady rozszerzania, nie oznacza, że ​​układ będzie wymuszał powiększanie rozmiaru MyWidget. Jeśli rozmiar MyWidget jest ustalony, nic nie może zrobić układ wewnętrzny.

Jeśli zwiększysz wartość MyWidget, powinieneś zobaczyć układ działający w nadziei. Być może musisz umieścić MyWidget w układzie pionowym, a jego polityka jest ustawiona na rozwijanie? Nie wiedząc, jak MyWidget ma swój rozmiar, trudno być pewnym.

+0

Nie sądzę, że to jest problem. Umieściłem QLayout w QFrame ustawiony jako centralWidget w QMainFrame - Układ będzie rósł z QMainWindow, ale spacinng nie rośnie. – Yester

+0

Tak, pomyślałem o tej samej rzeczy na dojeździe do domu dzisiaj ... Nie mogę się doczekać, aby jutro wejść i wypróbować ... Prawie w konstruktorze przejdę do 'MyWidget: setSizePolicy (QSizePolicy :: Expanding, QSizePolicy :: Expanding) ' – Constantin

2

Po długim czasie z obsługą ręczną i wieloma próbami, nie można zrobić tego, co się chce, za pomocą QFormLayout.

Ten układ jest przeznaczony do okien z wieloma polami do wypełnienia, ale tylko do tego.

Jeśli chcesz dodać większy odstęp między sekcjami formularza, możesz użyć QVBoxLayout z kilkoma odstępami QFormLayout w oddzielnych odstępach. Należy zauważyć, że w tym przypadku każda sekcja będzie miała własną szerokość pierwszej i drugiej kolumny, więc może to nie jest najlepsze rozwiązanie.

Drugim rozwiązaniem (jeśli mówimy o grupowaniu niektórych opcji) jest użycie kilku QGroupBoxów z QFormLayout. Grupy nie będą oddzielone rosnącym odstępem, ale będą bardzo czytelne i możesz nazwać swoje grupy. Jeśli opcje grupowania są tym, co chcesz zrobić - jest to prawdopodobnie najbardziej powszechny i ​​przyjazny dla użytkownika sposób, aby to zrobić.

Jeśli chcesz tylko efekt wizualny, który wskazałeś - kolumny o tej samej szerokości w każdej sekcji i rosnące odstępy między sekcjami, możesz użyć QGridLayout z 2 kolumnami i dodać przekładki w rzędach pomiędzy sekcjami. W tym przypadku musisz stworzyć QLabel, aby samemu umieścić w pierwszej kolumnie.

+0

Rozumiem twój punkt widzenia i wydaje mi się, że przeczytałem go w kilku miejscach. Mam więcej sztuczek, mam rękaw, który wypróbuję jutro. Będę was informować! Dzięki za wejście. – Constantin

1

Tylko dla potomności miałem podobny problem. Uważam, że o organizację jak poniżej spowoduje niczego w wewnętrznym układzie (QHBoxLayout), aby nie rozszerzać pionowo tak samo, jak gdybym upuścił je na QFormLayout sami:

QFormLayout 
-QHBoxLayout 
--QListWidget 

Jednak jeśli Dodałem warstwa zadnie umieszczając HBoxLayout w QWidget, następnie pracował prawidłowo określonej wielkości:

QFormLayout 
-QWidget 
--QHBoxLayout 
---QListWidget 

Więc może spróbuj dodać QWidget tam i oddanie spacer w jej wnętrzu.

0

Co zrobiłem to chyba trochę za włamanie i nie jest bardzo elegancki, ale to załatwiło sprawę w jednym rzędzie:

addRow(" ", (QWidget*)nullptr); 

To podwaja przestrzeń pomiędzy rzędami dodane przed i po tej rozmowy.