请输入:基本代码。创建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