38 int margin,
int hspace,
int vspace)
43 setContentsMargins (margin, margin, margin, margin);
50 setContentsMargins (margin, margin, margin, margin);
55 QLayoutItem *item = 0;
56 while ((item =
takeAt (0)))
69 SmartSpacing (QStyle::PM_LayoutHorizontalSpacing);
76 SmartSpacing (QStyle::PM_LayoutVerticalSpacing);
91 return DoLayout (QRect (0, 0, width, 0),
true);
96 return ItemList_.size ();
101 return ItemList_.value (idx);
106 if (idx >= 0 && idx < ItemList_.size ())
107 return ItemList_.takeAt (idx);
115 Q_FOREACH (
const QLayoutItem *item, ItemList_)
116 size = size.expandedTo (item->minimumSize ());
118 size += QSize (margin () * 2, margin () * 2);
124 QLayout::setGeometry (rect);
125 DoLayout (rect,
false);
133 int FlowLayout::DoLayout (
const QRect& rect,
bool testOnly)
const
135 int left = 0, top = 0, right = 0, bottom = 0;
136 getContentsMargins (&left, &top, &right, &bottom);
138 const QRect& effectiveRect = rect.adjusted (left, top, -right, -bottom);
139 int x = effectiveRect.x ();
140 int y = effectiveRect.y ();
143 Q_FOREACH (QLayoutItem *item, ItemList_)
145 QWidget *widget = item->widget ();
149 spaceX = widget->style ()->layoutSpacing (QSizePolicy::PushButton,
150 QSizePolicy::PushButton, Qt::Horizontal);
153 spaceY = widget->style ()->layoutSpacing (QSizePolicy::PushButton,
154 QSizePolicy::PushButton, Qt::Vertical);
156 const auto&
sizeHint = item->sizeHint ();
157 const int hintWidth =
sizeHint.width ();
158 int nextX = x + hintWidth + spaceX;
159 if (nextX - spaceX > effectiveRect.right () &&
162 x = effectiveRect.x ();
163 y += lineHeight + spaceY;
164 nextX = x + hintWidth + spaceX;
169 item->setGeometry (QRect (QPoint (x, y),
sizeHint));
172 lineHeight = std::max (lineHeight,
sizeHint.height ());
175 return y + lineHeight - rect.y () + bottom;
178 int FlowLayout::SmartSpacing (QStyle::PixelMetric pm)
const
180 QObject *obj = parent ();
183 else if (obj->isWidgetType ())
185 QWidget *pw =
static_cast<QWidget*
> (obj);
186 return pw->style ()->pixelMetric (pm, 0, pw);
189 return static_cast<QLayout*
> (obj)->spacing ();
FlowLayout(QWidget *, int=-1, int=-1, int=-1)
void setGeometry(const QRect &)
QLayoutItem * takeAt(int)
QLayoutItem * itemAt(int) const
Qt::Orientations expandingDirections() const
QSize minimumSize() const
int horizontalSpacing() const
bool hasHeightForWidth() const
int heightForWidth(int) const
void addItem(QLayoutItem *)
int verticalSpacing() const