输入:基本代码。创建 25 个 QPushButtons
,并用一个 QVBoxLayout
将其包装在一个 QWidget
中,该 QWidget
本身是顶部 scroll_area_test-QWidget
中处理小部件放置的唯一子项的顶部 QVBoxLayout 的唯一子项。第二个 QWidget
包装可能听起来多余,但以后会派上用场。
#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
中的外观相比。
我已经尝试过大小约束和策略(由注释掉的代码显示),但这些在视觉上没有任何改变。
注意:我在一个更复杂的情况中遇到了这个问题,但能够将其抽象成这个例子。