【问题标题】:Widgets wrapped in QScrollArea do not use up available size包裹在 QScrollArea 中的小部件不会用完可用大小
【发布时间】: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


    【解决方案1】:

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

    将策略设置为水平和垂直固定,如下所述。

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

    【讨论】:

    • 谢谢。这做了一些有趣的事情,因为它保持了原始示例中的宽度,但高度仍然太低。此外,这样,调整窗口大小是可能的,但毫无价值,因为滚动区域不会随父窗口小部件一起增长。鉴于滚动区域应始终与父级一起调整大小,因此对其使用固定大小策略听起来不是一个好主意。
    • 如果您只为水平设置固定策略而为垂直设置另一个策略会怎样?通常有一个更有趣的大小标志,如 QSizePolicy::Expanding 可能有帮助也可能没有帮助:doc.qt.io/qt-5/qsizepolicy.html#Policy-enum
    猜你喜欢
    • 2014-11-20
    • 2020-12-12
    • 2012-04-14
    • 1970-01-01
    • 2021-05-18
    • 2014-03-08
    • 2018-03-22
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多