2013-01-10 11 views
6

Struktura moich widżetów to:Jak mogę spowodować przepełnienie widgetów, aby pasek przewijania pojawił się w Qt?

QWidget dostosowany do panelu z zaokrąglonymi obramowaniami.

Aby zawierać obszar przewijania wewnątrz granic z marginesu, a następnie umieścić ten Wewnątrz:

QScrollArea z QVBoxLayout (pionowo dodawanie treści)

Następnie dodaję wewnątrz on seria:

QGroupBox z tytułowy z odstępem 0, a QFormLayout

Formlayout nie działa tak, jak myślałem. Widżety w środku to etykiety + spinboksy, wszystkie z nich.

Oto zdjęcie:

Image

pierwszy. Nie są wyśrodkowane. Nie wiem dlaczego.

Po drugie. Wszystkie one mają taki sam stały rozmiar, jak im powiedziałem, ale i tak są ułożone, nie zgniecione, więc się chowają. Dlaczego nie utrzymuje się tego rozmiaru, a rodzic QScrollArea pokazuje pasek przewijania na zewnątrz ?. To jest to czego chce.

Nie chcę, aby zawartość była zgnieciona lub rozciągnięta. Chcę, żeby były na szczycie. Jeśli ekran jest bardzo duży, panel będzie długi, ale zawartość będzie na górze, zawsze o tym samym rozmiarze.


Ktoś poprosił o kod, więc go tutaj skopiuję, ale kod jest naprawdę duży ... Myślę, że to bardziej zagmatwane. Ale dobrze, źle usuń linie bez znaczenia. Oto część można zobaczyć w tym polu:

// THE PANEL OUTSIDE (A QWIDGET) is mainParametersLayout_. This particular scroll bar inside 
    // is cameraModeParametersPanel_ 

    cameraModeParametersPanel_ = new QScrollArea(); 
    cameraModeParametersPanel_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    cameraModeParametersPanel_->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); 
    mainParametersLayout_->addWidget(cameraModeParametersPanel_); 

    // HERE THERE ARE TWO MORE QGROUP BOXES. THE ONE THAT DOESN´T STAY THE WAY I SHOWED IS THIS. 

    QVBoxLayout* mainCameraLayout = new QVBoxLayout(cameraModeParametersPanel_); 
    mainCameraLayout->setSpacing(5); 

    // GROUP BOX 
    QGroupBox* activeCameraParametersGroup = new QGroupBox(); 
    activeCameraParametersGroup->setObjectName(parametersContainerName); 
    activeCameraParametersGroup->setTitle(strings->cameraModeCameraParamsTitle); 
    mainCameraLayout->addWidget(activeCameraParametersGroup); 

    // LAYOUT 
    QFormLayout* paramLayout = new QFormLayout(activeCameraParametersGroup); 
    paramLayout->setRowWrapPolicy(QFormLayout::DontWrapRows); 
    paramLayout->setFormAlignment(Qt::AlignHCenter | Qt::AlignTop); 
    paramLayout->setLabelAlignment(Qt::AlignRight); 


    // Iso : Spin Integer 
    isoSpin = new SmartIntSpinButtons(control->getMinISO(), control->getMaxISO()); 
    isoSpin->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); 
    paramLayout->addRow(strings->cameraISOCapString, isoSpin); 

    // FStop: Spin Double 
    fstopSpin = new SmartDoubleSpinButtons(control->getMinFStop(), control->getMaxFStop(), 2); 
    fstopSpin->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); 
    paramLayout->addRow(strings->cameraFStopString, fstopSpin); 



    // some other spins here... 



    // Camera position: 3 Spin Double (X,Y,Z) 
    camPosSpinX = new SmartDoubleSpinButtons(control->getMinCamPos(), control->getMaxCamPos(), 1); 
    camPosSpinY = new SmartDoubleSpinButtons(control->getMinCamPos(), control->getMaxCamPos(), 1); 
    camPosSpinZ = new SmartDoubleSpinButtons(control->getMinCamPos(), control->getMaxCamPos(), 1); 

    camPosSpinX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    camPosSpinY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    camPosSpinZ->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 

    paramLayout->addRow(new QLabel(strings->cameraPositionString)); 
    QHBoxLayout* positionLy = new QHBoxLayout(); 
    positionLy->addWidget(camPosSpinX); 
    positionLy->addWidget(camPosSpinY); 
    positionLy->addWidget(camPosSpinZ); 
    paramLayout->addRow(positionLy); 

    // Target Position: 3 Spin Double(X,Y,Z) 
    camTargetPosSpinX = new SmartDoubleSpinButtons(control->getMinCamTarget(), control->getMaxCamTarget(), 1); 
    camTargetPosSpinY = new SmartDoubleSpinButtons(control->getMinCamTarget(), control->getMaxCamTarget(), 1); 
    camTargetPosSpinZ = new SmartDoubleSpinButtons(control->getMinCamTarget(), control->getMaxCamTarget(), 1); 

    camTargetPosSpinX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    camTargetPosSpinY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    camTargetPosSpinZ->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 

    paramLayout->addRow(new QLabel(strings->cameraTargetPositionString)); 
    QHBoxLayout* targetLy = new QHBoxLayout(); 
    targetLy->addWidget(camTargetPosSpinX); 
    targetLy->addWidget(camTargetPosSpinY); 
    targetLy->addWidget(camTargetPosSpinZ); 
    paramLayout->addRow(targetLy); 

    // and the resoultion spins, which are the same style like the last one (but only X and Y). 

Teraz przychodzi stylów wszystkim:

/* THE PANEL THAT CONTAINS THE QSCROLLBAR OUTSIDE */ 

SmartPanel 
{ 
    background-image: url(:/resources/images/containers/panel_bg.png); 
    background-repeat: repeat-y; 
    background-position: left top; 
    background-color: white; 
    border: 1px solid #aaa; 
    border-radius: 10; 
    min-width: 20px; 
    padding: 5px; 

} 


QScrollArea#parametersPanelScrollArea 
{ 
    background: transparent; 
    border: none; 
} 


/* the qgroupbox */ 


QGroupBox#parametersContainer 
{ 
    background-color: white; 
    padding-top: 25px; 
    border-style: solid; 
    border-width: 1px; 
    border-color: #aaa; 
    border-radius: 10px; 
} 

QGroupBox#parametersContainer::title { 
    subcontrol-origin: margin; 
    subcontrol-position: top center; 
    border: 1px solid #aaa; 
    margin-top: -5px; 
    padding: 8px 5px 5px 5px; 
    font-size: 18px; 
    border-radius: 5px; 
}  


/* ------------------ SPINBOX WIDGET ------------------------------------------*/ 

QWidget#intSpin, QWidget#doubleSpin 
{ 
    min-height: 20px; 
    border: 1px solid #ccc; 
    padding: 0px; 
    border-top-left-radius: 4px; 
    border-bottom-left-radius: 4px; 
    background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #ddd, stop:1 #fff); 
} 

QPushButton#upSpinBtn, 
QPushButton#downSpinBtn 
{ 
    border-radius: 0px; 
    /*background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #ddd, stop:1 #fff);*/ 
    background-repeat: no-repeat; 
    background-position: center; 
    border: none; 
} 

QPushButton#upSpinBtn 
{ 
    background-image: url(:/resources/images/buttons/up_sm_arrow.png); 
} 

QPushButton#downSpinBtn 
{ 
    background-image: url(:/resources/images/buttons/down_sm_arrow.png); 
} 
+1

ow dodałeś to? Pokaż nam kod, a nie wynik. –

+0

Masz cały kod. Mam nadzieję, że to przydatne! – darkgaze

+0

Teraz wszystko jest jasne. Nie powinieneś ustawiać układu na obszarze przewijania. Zamiast tego użyj metody 'QScrollArea :: setWidget (QWidget *)'. –

Odpowiedz

16

QScrollArea nie jest kontenerem. QScrollArea to "przewijany widok" dla innego widżetu. Nie powinieneś konfigurować układu na QScrollArea. Powinieneś stworzyć widżet, wypełnić go odpowiednim układem, a następnie użyć QScrollArea::setWidget(QWidget *), aby przewinąć.

+0

Oh. Czy powinienem umieścić qwidget w środku, a następnie ustawić dla niego układ i wstawić QGroupBox? – darkgaze

+0

TAK! WSPANIAŁY. Zabawne jest to, że czytałem wszystko na dokumentach, a oni o tym nie wspominali. setLayout jest dostępny i nie powinien być używany. To jest interesujące do zapamiętania. Wielkie dzięki. Przepraszamy za nie głosowanie, ale nie mam wystarczającej reputacji :-( – darkgaze

+0

setLayout jest dostępny na każdym widgetu, jak pamiętam (nawet na QPushButton), ale w "Szczegółowym opisie" QScrollArea jest wyraźnie napisane, że musisz użyć 'setWidget' –

Powiązane problemy