2013-01-10 14 views
6

Cấu trúc tiện ích con của tôi là:Làm thế nào tôi có thể làm cho các widget tràn để làm cho một thanh cuộn xuất hiện trong Qt?

QWidget được tùy chỉnh thành bảng có đường viền tròn.

Để chứa một khu vực có thanh cuộn bên trong biên giới với một biên độ, sau đó tôi đặt bên này:

QScrollArea với một (nội dung theo chiều dọc thêm) QVBoxLayout

Sau đó, tôi thêm bên trong của nó một loạt:

QGroupBox với tiêu đề với khoảng cách 0, và một QFormLayout

Formlayout không hoạt động như tôi nghĩ. Các tiện ích bên trong là các nhãn + hộp xoay tròn, tất cả chúng.

Dưới đây là một hình ảnh:

Image

đầu tiên. Chúng không tập trung. Tôi không biết tại sao.

Thứ hai. Tất cả chúng đều có cùng một kích thước cố định, như tôi đã nói với chúng, nhưng chúng vẫn chồng chất, không bị đè bẹp, vì vậy chúng ẩn nhau. Tại sao nó không ở kích thước đó và QScrollArea của cha mẹ cho thấy thanh cuộn bên ngoài ?. Đó là điều tôi muốn.

Tôi không muốn nội dung bị đè bẹp hoặc kéo dài. Tôi muốn họ đứng đầu. Nếu màn hình là rất lớn, bảng điều khiển sẽ được dài, nhưng nội dung sẽ được trên đầu trang, allways với kích thước tương tự.


Ai đó đã yêu cầu mã, vì vậy tôi sao chép mã ở đây, nhưng mã thực sự lớn ... Tôi nghĩ nó khó hiểu hơn. Nhưng tốt, bệnh loại bỏ các dòng không có ý nghĩa. Dưới đây là phần mà bạn thấy trong hộp:

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

Bây giờ đến stylesheet của tất cả:

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

bạn đã thêm tiền vào tài khoản? Hiển thị cho chúng tôi một số mã, không phải kết quả –

+0

Ở đó bạn có toàn bộ mã. Hy vọng nó hữu ích! – darkgaze

+0

Mọi thứ đã rõ ràng. Bạn không nên đặt bố trí trên khu vực cuộn. Thay vào đó hãy sử dụng phương thức 'QScrollArea :: setWidget (QWidget *)'. –

Trả lời

16

QScrollArea không phải là một container. QScrollArea là "chế độ xem cuộn" cho một tiện ích khác. Bạn không nên thiết lập bố trí trên QScrollArea. Bạn nên tạo tiện ích, điền nó với bố cục thích hợp và sau đó sử dụng QScrollArea::setWidget(QWidget *) để làm cho nó có thể cuộn được.

+0

Oh. Tôi có nên đặt một qwidget bên trong, và sau đó thiết lập cho nó một bố cục và chèn QGroupBoxes? – darkgaze

+0

CÓ! TUYỆT VỜI. Điều buồn cười là tôi đọc tất cả mọi thứ trên các tài liệu, và họ đã không đề cập đến điều này. setLayout có sẵn và không nên sử dụng. Đó là thú vị để nhớ. Cảm ơn rất nhiều. Xin lỗi vì không bầu bạn, nhưng tôi không có đủ danh tiếng :-( – darkgaze

+0

setLayout có sẵn trên mọi tiện ích như tôi nhớ (ngay cả trên QPushButton) nhưng trong "Mô tả chi tiết" của QScrollArea, rõ ràng là bạn phải sử dụng 'setWidget' –