2017-09-14 70 views
2

請輸入:基本代碼。創建25 QPushButtons,包裝在QWidget中,其中QVBoxLayoutQWidget)本身就是頂級QVBoxLayout的唯一孩子,該頂級QVBoxLayout處理頂部scroll_area_test-QWidget中的小部件放置。第二個QWidget包裝可能聽起來多餘,但稍後會派上用場。包裝在QScrollArea中的小工具未使用可用尺寸

#include <QVBoxLayout> 
#include <QScrollArea> 
#include <QWidget> 
#include <QPushButton> 
#include <QApplication> 

/* 
* This declaration actually lives in its own header file, 
* but for simplicity's sake this code includes it here directly. 
*/ 
class scroll_area_test : public QWidget { 
    Q_OBJECT 

    public: 
    scroll_area_test(); 
}; 

scroll_area_test::scroll_area_test() { 
    QVBoxLayout *top_layout = new QVBoxLayout (this); 

    QWidget *contents = new QWidget (this); 
    top_layout->addWidget (contents); 

    QVBoxLayout* inner_layout = new QVBoxLayout (contents); 

    for (size_t i = 0; i < 25; ++i) { 
    QPushButton *tmp_button = new QPushButton (this); 
    inner_layout->addWidget (tmp_button); 
    } 
} 

int main (int argc, char **argv) { 
    QApplication app (argc, argv); 

    scroll_area_test widget; 
    widget.show(); 

    return (app.exec()); 
} 

這工作正常。它產生一個窗口,上面有25個按鈕。鑑於我的顯示分辨率足夠高,我可以看到整個窗口。一切都很華麗。

Without QScrollArea

別急,如果什麼用戶的分辨率是比我自己低?窗戶太大,不適合他們的屏幕!唉,有這種情況的解決方案。輸入:QScrollArea

scroll_area_test::scroll_area_test() { 
    QVBoxLayout *top_layout = new QVBoxLayout (this); 

    QScrollArea *scrolling_area = new QScrollArea (this); 
    scrolling_area->setWidgetResizable (true); 
    scrolling_area->setFocusPolicy (Qt::NoFocus); 
    top_layout->addWidget (scrolling_area); 

    QWidget *contents = new QWidget (this); 
    //contents->setSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); 

    QVBoxLayout* inner_layout = new QVBoxLayout (contents); 
    //inner_layout->setSizeConstraint (QLayout::SetMinimumSize); 

    for (size_t i = 0; i < 25; ++i) { 
    QPushButton *tmp_button = new QPushButton (this); 
    inner_layout->addWidget (tmp_button); 
    } 

    scrolling_area->setWidget (contents); 
} 

我希望這不會改變我的系統上的佈局,因爲有足夠的空間顯示所有小部件。

然而,這就是新的輸出:

With QScrollArea

我在做什麼錯?我希望滾動區域自動調整爲其子大小(因此爲setWidgetResizable (true)),以最大窗口大小爲界。這似乎並非如此。包含小部件的大小沒有被正確地考慮到,因此滾動區域是a)。高度小於它應該是b)。寬度大於它應該是,與沒有包裝QWidgetQScrollArea的外觀相比。

我已經玩過大小限制和策略(通過註釋代碼顯示),但這些內容並沒有改變任何視覺效果。

N.B .:我在一個非常複雜的情況下遇到了這個問題,但能夠將它抽象爲這個例子。

回答

0

您需要爲您的QScrollArea對象設置尺寸政策。

設置橫向和縱向固定的策略,如下所述。

QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
scrolling_area->setSizePolicy(sizePolicy); 
+0

謝謝。這樣做有點有趣,因爲它保持了原始示例中的寬度,但高度仍然太低。此外,通過這種方式,可以調整窗口大小,但不值錢,因爲滾動區域不隨父窗口小部件一起增長。鑑於滾動區域應始終與父級調整大小,對其使用固定大小的策略聽起來不是一個好主意。 – Ionic