包含在QScrollArea中的窗口小部件不会耗尽可用大小

输入:基本代码 . 使用 QVBoxLayout 创建包含在 QWidget 中的25 QPushButtons ,其中( QWidget )本身是top-QVBoxLayout的唯一子项,用于处理顶部 scroll_area_test-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个按钮 . 鉴于我的显示分辨率足够高,我可以看到完整的窗口 . 一切都很花花公子 .

Without 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);
}

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

但是,这是新的输出:

With QScrollArea

我究竟做错了什么?我希望滚动区域自动调整为其子项的大小(因此 setWidgetResizable (true) ),以最大窗口大小为限 . 这似乎不是这种情况 . 包含小部件的大小没有被正确考虑,因此滚动区域是一个 . )高度应该小于b . )宽度大于应该的大小,两者都与未包装 QWidgetQScrollArea 中的外观相比 .

我已经玩过大小限制和策略(由注释掉的代码显示),但这些并没有在视觉上改变任何东西 .

N.B . :我在一个更复杂的情况下遇到了这个问题,但是能够将它抽象为这个例子 .

回答(1)

3 years ago

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

如下所述,设置水平和垂直固定的策略 .

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