【发布时间】:2017-09-14 22:50:37
【问题描述】:
输入:基本代码。创建 25 个QPushButtons,用QVBoxLayout 包裹在QWidget 中,其中(QWidget)本身就是处理顶部scroll_area_test-QWidget 中小部件放置的top-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.
我已经尝试过大小限制和策略(由注释掉的代码显示),但这些并没有在视觉上改变任何东西。
注意:我在一个更复杂的情况下遇到了这个问题,但能够将其抽象为这个例子。
【问题讨论】:
标签: qt qscrollarea