請輸入:基本代碼。創建25 QPushButtons
,包裝在QWidget
中,其中QVBoxLayout
(QWidget
)本身就是頂級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個按鈕。鑑於我的顯示分辨率足夠高,我可以看到整個窗口。一切都很華麗。
別急,如果什麼用戶的分辨率是比我自己低?窗戶太大,不適合他們的屏幕!唉,有這種情況的解決方案。輸入: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);
}
我希望這不會改變我的系統上的佈局,因爲有足夠的空間顯示所有小部件。
然而,這就是新的輸出:
我在做什麼錯?我希望滾動區域自動調整爲其子大小(因此爲setWidgetResizable (true)
),以最大窗口大小爲界。這似乎並非如此。包含小部件的大小沒有被正確地考慮到,因此滾動區域是a)。高度小於它應該是b)。寬度大於它應該是,與沒有包裝QWidget
在QScrollArea
的外觀相比。
我已經玩過大小限制和策略(通過註釋代碼顯示),但這些內容並沒有改變任何視覺效果。
N.B .:我在一個非常複雜的情況下遇到了這個問題,但能夠將它抽象爲這個例子。
謝謝。這樣做有點有趣,因爲它保持了原始示例中的寬度,但高度仍然太低。此外,通過這種方式,可以調整窗口大小,但不值錢,因爲滾動區域不隨父窗口小部件一起增長。鑑於滾動區域應始終與父級調整大小,對其使用固定大小的策略聽起來不是一個好主意。 – Ionic