55 #include "flowlayout.h"
57 FlowLayout::FlowLayout(
QWidget *parent,
int margin,
int hSpacing,
int vSpacing)
58 :
QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
60 setContentsMargins(margin, margin, margin, margin);
63 FlowLayout::FlowLayout(
int margin,
int hSpacing,
int vSpacing)
64 : m_hSpace(hSpacing), m_vSpace(vSpacing)
66 setContentsMargins(margin, margin, margin, margin);
69 FlowLayout::~FlowLayout()
72 while ((item = takeAt(0)))
81 int FlowLayout::horizontalSpacing()
const
90 int FlowLayout::verticalSpacing()
const
99 int FlowLayout::count()
const
101 return itemList.
size();
106 return itemList.
value(index);
111 if (index >= 0 && index < itemList.
size())
112 return itemList.
takeAt(index);
122 bool FlowLayout::hasHeightForWidth()
const
127 int FlowLayout::heightForWidth(
int width)
const
129 int height = doLayout(
QRect(0, 0, width, 0),
true);
133 void FlowLayout::setGeometry(
const QRect &rect)
136 doLayout(rect,
false);
139 QSize FlowLayout::sizeHint()
const
141 return minimumSize();
144 QSize FlowLayout::minimumSize()
const
148 foreach (item, itemList)
155 int FlowLayout::doLayout(
const QRect &rect,
bool testOnly)
const
159 QRect effectiveRect = rect.
adjusted(+left, +top, -right, -bottom);
160 int x = effectiveRect.
x();
161 int y = effectiveRect.
y();
167 for (
int i = 0; i < itemList.
length(); i++) {
168 item = itemList.
at(i);
170 spaceX = horizontalSpacing();
174 int spaceY = verticalSpacing();
180 if (nextX - spaceX > effectiveRect.
right() && lineHeight > 0) {
182 int offset = qFloor((effectiveRect.
right() + spaceX - x) / 2);
183 for(
int j = i-1; j > i-1-rowCount; j--) {
184 auto rowItem = itemList.
at(j);
185 rowItem->
setGeometry(rowItem->geometry().adjusted(offset, 0, offset, 0));
189 x = effectiveRect.
x();
190 y = y + lineHeight + spaceY;
206 int offset = qFloor((effectiveRect.
right() + spaceX - x) / 2);
207 for (
int j = itemList.
length()-1; j > itemList.
length()-1-rowCount; j--) {
208 auto rowItem = itemList.
at(j);
209 rowItem->
setGeometry(rowItem->geometry().adjusted(offset, 0, offset, 0));
213 return y + lineHeight - rect.
y() + bottom;
virtual void setGeometry(const QRect &r)=0
virtual int pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const const =0
const T & at(int i) const const
QTextStream & right(QTextStream &stream)
T value(int i) const const
QTextStream & left(QTextStream &stream)
void getContentsMargins(int *left, int *top, int *right, int *bottom) const const
void append(const T &value)
virtual QSize minimumSize() const const =0
QRect adjusted(int dx1, int dy1, int dx2, int dy2) const const
PM_LayoutHorizontalSpacing
QSize expandedTo(const QSize &otherSize) const const
virtual int layoutSpacing(QSizePolicy::ControlType control1, QSizePolicy::ControlType control2, Qt::Orientation orientation, const QStyleOption *option, const QWidget *widget) const const =0
Qt::Alignment alignment() const const
int spacing() const const
QObject * parent() const const
virtual void setGeometry(const QRect &r) override
virtual QSize sizeHint() const const =0