QScrollArea中包含的小部件未使用可用大小

4

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

但是,如果用户的分辨率低于我的分辨率怎么办?窗口会太大,无法适应他们的屏幕!为此类情况提供了解决方案:进入: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);
}

我本来希望这不会在我的系统上改变布局,因为有足够的空间显示所有小部件。

然而,现在的输出是这样的:

使用QScrollArea

我做错了什么?我想让滚动区域自动调整大小以适应其子项的大小(因此采用了setWidgetResizable (true)),受最大窗口大小限制。但这似乎不是这种情况。容器小部件的大小没有得到正确考虑,因此滚动区域 a.) 高度比它应该小, b.) 宽度比它应该大,与不包装 QWidgetQScrollArea 中的外观相比。

我已经尝试过大小约束和策略(由注释掉的代码显示),但这些在视觉上没有任何改变。

注意:我在一个更复杂的情况中遇到了这个问题,但能够将其抽象成这个例子。

1个回答

0

您需要为您的QScrollArea对象设置大小策略。

按照下面所说的方式,将策略固定在水平和垂直方向上。

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

谢谢。这段代码做了一些有趣的事情,它保持了原始示例中的宽度,但高度仍然太低。此外,使用此代码可以调整窗口大小,但毫无意义,因为滚动区域不会随父部件而增长。鉴于滚动区域应始终与父级一起调整大小,在其上使用固定大小策略似乎不是一个好主意。 - Ionic
如果您仅为水平设置Fixed策略,而为垂直设置另一个策略会发生什么?通常有更多有趣的大小标志,例如QSizePolicy :: Expanding,可能有助于解决问题:https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum - uli42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接