2013-01-10 9 views
6

La struttura dei miei widget è:Come posso fare overflow di widget per far apparire una barra di scorrimento in Qt?

QWidget personalizzato per essere un pannello con bordi arrotondati.

per contenere una zona con barra di scorrimento all'interno dei confini con un margine, poi ho messo questo all'interno:

QScrollArea con un (contenuto in verticale l'aggiunta) QVBoxLayout

poi aggiungo all'interno di esso un serie di:

QGroupBox con titolo con spaziatura 0, e una QFormLayout

Il formlayout non funziona come pensavo. I widget all'interno sono le etichette + spinbox, tutti loro.

Ecco un'immagine:

Image

First. Non sono centrati Non so perché.

Secondo. Hanno tutti la stessa misura fissa, come ho detto loro, ma sono ammucchiati comunque, non schiacciati, quindi si nascondono. Perché non rimane tale dimensione e il genitore QScrollArea mostra la barra di scorrimento all'esterno ?. È quello che voglio.

Non voglio che il contenuto sia schiacciato o allungato. Voglio che siano in cima. Se lo schermo è molto grande, il pannello sarà lungo, ma i contenuti saranno in alto, sempre con le stesse dimensioni.


Qualcuno ha richiesto il codice, in modo copio qui, ma il codice è davvero grande ... Penso che sia più confusa. Ma bene, malato rimuovere le linee senza significato. Qui è la parte che si vede in quella scatola:

// 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). 

Ora arriva il foglio di stile di tutti:

/* 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 hai aggiunto? Mostraci un codice, non il risultato –

+0

Lì hai l'intero codice. Spero sia utile! – darkgaze

+0

Tutto è chiaro ora. Non dovresti impostare il layout nell'area di scorrimento. Usa invece il metodo 'QScrollArea :: setWidget (QWidget *)'. –

risposta

16

QScrollArea non è un contenitore. QScrollArea è una "vista a scorrimento" per un altro widget. Non dovresti configurare il layout su QScrollArea. È necessario creare un widget, riempirlo con un layout appropriato e quindi utilizzare QScrollArea::setWidget(QWidget *) per renderlo scorrevole.

+0

Oh. Dovrei inserire un qwidget all'interno e quindi impostare un layout e inserire QGroupBoxes? – darkgaze

+0

SÌ! Eccellente. La cosa divertente è che ho letto tutto sui documenti, e loro non lo hanno menzionato. setLayout è disponibile e non dovrebbe essere usato. È interessante da ricordare. Molte grazie. Scusa per non averti votato, ma non ho abbastanza reputazione :-( – darkgaze

+0

setLayout è disponibile su ogni widget come ricordo (anche su QPushButton) ma in "Descrizione dettagliata" di QScrollArea c'è scritto chiaramente che devi usare 'setWidget' –