2013-01-10 17 views
6

Die Struktur meiner Widgets ist:Wie kann ich Widgets überlaufen lassen, um eine Bildlaufleiste in Qt erscheinen zu lassen?

QWidget angepasst, um ein Panel mit abgerundeten Grenzen zu sein.

Um einen Bereich mit scrollbar innerhalb der Grenzen mit einer Marge zu enthalten, dann habe ich diese Innen:

QScrollArea mit einem QVBoxLayout (vertikal Hinzufügen von Inhalten)

Dann füge I davon in einer Reihe von:

QGroupBox mit Titel mit Abstand 0 ist, und ein QFormLayout

Das Formlayout funktioniert nicht so, wie ich es dachte. Die Widgets im Inneren sind die Etiketten + Spinboxen, alle von ihnen.

Hier ist ein Bild:

Image

Erste. Sie sind nicht zentriert. Ich weiß nicht warum.

Sekunde. Sie haben alle die gleiche feste Größe, wie ich ihnen sagte, aber sie sind trotzdem gestapelt, nicht zusammengedrückt, also verstecken sie sich gegenseitig. Warum bleibt es nicht so groß und die übergeordnete QScrollArea zeigt die Bildlaufleiste draußen? Das ist, was ich will.

Ich möchte nicht, dass der Inhalt gequetscht oder gestreckt wird. Ich möchte, dass sie oben stehen. Wenn der Bildschirm sehr groß ist, ist das Panel lang, aber der Inhalt wird immer gleich groß sein.

Jemand hat den Code angefordert, also kopiere ich ihn hier, aber der Code ist wirklich groß ... Ich denke, es ist verwirrender. Aber gut, krank entfernen Sie die Zeilen ohne Bedeutung. Hier ist der Teil, den Sie in diesem Feld sehen:

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

Jetzt kommt das Stylesheet von allen:

/* 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

Haben Sie es hinzugefügt? Zeigen Sie uns einen Code, nicht das Ergebnis –

+0

Dort haben Sie den ganzen Code. Hoffe es ist nützlich! – darkgaze

+0

Alles ist jetzt klar. Sie sollten das Layout nicht im Bildlaufbereich festlegen. Verwenden Sie stattdessen die Methode 'QScrollArea :: setWidget (QWidget *)'. –

Antwort

16

QScrollArea ist kein Container. QScrollArea ist eine "Scroll-Ansicht" für ein anderes Widget. Sie sollten das Layout in QScrollArea nicht einrichten. Sie sollten ein Widget erstellen, es mit dem richtigen Layout füllen und dann QScrollArea::setWidget(QWidget *) verwenden, um es scrollbar zu machen.

+0

Oh. Sollte ich ein qwidget hineinlegen, und dann ein Layout erstellen und die QGroupBoxes einfügen? – darkgaze

+0

JA! HERVORRAGEND. Das Lustige ist, ich lese alles in den Dokumenten, und sie haben das nicht erwähnt. setLayout ist verfügbar und sollte nicht verwendet werden. Das ist interessant zu erinnern. Danke vielmals. Entschuldigung dafür, dass ich dich nicht gewählt habe, aber ich habe nicht genug Reputation :-( – darkgaze

+0

setLayout ist auf jedem Widget verfügbar, wie ich mich erinnere (sogar auf QPushButton), aber in "Detaillierte Beschreibung" von QScrollArea ist klar geschrieben, dass du verwenden musst 'setWidget' –