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

时间:2017-09-14 22:50:38

标签: qt qscrollarea

输入:基本代码。使用QPushButtons创建包含在QWidget中的25个QVBoxLayout,其中QWidget本身是顶级QVBoxLayout的唯一子项,用于处理我们顶部的小部件展示位置{ {1}}。第二个scroll_area_test-QWidget包装可能听起来多余,但稍后会派上用场。

QWidget

这很好用。它产生一个窗口,上面有25个按钮。鉴于我的显示分辨率足够高,我可以看到完整的窗口。一切都花花公子。

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

QScrollArea

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

然而,这是新的输出:

With 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); } ),以最大窗口大小为限。这似乎不是这种情况。包含小部件的大小没有被正确考虑,因此滚动区域是a。)高度应该比它应该更小,b。)宽度大于应该的大小,两者都与没有包裹的外观相比setWidgetResizable (true)中的QWidget

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

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

1 个答案:

答案 0 :(得分:0)

您需要为QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); scrolling_area->setSizePolicy(sizePolicy); 对象设置尺寸政策。

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

start = new Date(2017,9,14)
end = new Date(2017,9,24)
var days = (end - start)/(1000*60*60*24)// 10 days just for example, you already have this number
var daysOfWeek = [0,0,0,0,0,0,0]// array to hold results 

for(var i = 0; i < days;i++){
 x = start.getDay();
 daysOfWeek[x] += 1;
 start = addDays(start,1);
}
console.log(daysOfWeek)



function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}