17class QStackedLayoutPrivate :
public QLayoutPrivate
19 Q_DECLARE_PUBLIC(QStackedLayout)
21 QStackedLayoutPrivate() : index(-1), stackingMode(QStackedLayout::StackOne) {}
22 QLayoutItem* replaceAt(
int index, QLayoutItem *newitem) override;
23 QList<QLayoutItem *> list;
25 QStackedLayout::StackingMode stackingMode;
28QLayoutItem* QStackedLayoutPrivate::replaceAt(
int idx, QLayoutItem *newitem)
31 if (idx < 0 || idx >= list.size() || !newitem)
33 QWidget *wdg = newitem->widget();
34 if (Q_UNLIKELY(!wdg)) {
35 qWarning(
"QStackedLayout::replaceAt: Only widgets can be added");
38 QLayoutItem *orgitem = list.at(idx);
39 list.replace(idx, newitem);
41 q->setCurrentIndex(index);
199int QStackedLayout::insertWidget(
int index, QWidget *widget)
202 addChildWidget(widget);
203 index = qMin(index, d->list.size());
205 index = d->list.size();
206 QWidgetItem *wi = QLayoutPrivate::createWidgetItem(
this, widget);
207 d->list.insert(index, wi);
210 setCurrentIndex(index);
212 if (index <= d->index)
214 if (d->stackingMode == StackOne)
218 emit widgetAdded(index);
243QLayoutItem *QStackedLayout::takeAt(
int index)
246 if (index <0 || index >= d->list.size())
248 QLayoutItem *item = d->list.takeAt(index);
249 if (index == d->index) {
251 if ( d->list.size() > 0 ) {
252 int newIndex = (index == d->list.size()) ? index-1 : index;
253 setCurrentIndex(newIndex);
255 emit currentChanged(-1);
257 }
else if (index < d->index) {
260 emit widgetRemoved(index);
261 if (item->widget() && !qt_wasDeleted(item->widget()))
262 item->widget()->hide();
274void QStackedLayout::setCurrentIndex(
int index)
277 QWidget *prev = currentWidget();
278 QWidget *next = widget(index);
279 if (!next || next == prev)
282 bool reenableUpdates =
false;
283 QWidget *parent = parentWidget();
285 if (parent && parent->updatesEnabled()) {
286 reenableUpdates =
true;
287 parent->setUpdatesEnabled(
false);
290 QPointer<QWidget> fw = parent ? parent->window()->focusWidget() :
nullptr;
291 const bool focusWasOnOldPage = fw && (prev && prev->isAncestorOf(fw));
295 if (d->stackingMode == StackOne)
307 if (focusWasOnOldPage) {
309 if (QWidget *nfw = next->focusWidget())
313 if (QWidget *i = fw) {
314 while ((i = i->nextInFocusChain()) != fw) {
315 if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus)
316 && !i->focusProxy() && i->isVisibleTo(next) && i->isEnabled()
317 && next->isAncestorOf(i)) {
330 parent->setUpdatesEnabled(
true);
331 emit currentChanged(index);
416QSize QStackedLayout::sizeHint()
const
418 Q_D(
const QStackedLayout);
420 int n = d->list.size();
422 for (
int i = 0; i < n; ++i)
423 if (QWidget *widget = d->list.at(i)->widget()) {
424 QSize ws(widget->sizeHint());
425 if (widget->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
427 if (widget->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
429 s = s.expandedTo(ws);
452void QStackedLayout::setGeometry(
const QRect &rect)
455 switch (d->stackingMode) {
457 if (QWidget *widget = currentWidget())
458 widget->setGeometry(rect);
461 if (
const int n = d->list.size())
462 for (
int i = 0; i < n; ++i)
463 if (QWidget *widget = d->list.at(i)->widget())
464 widget->setGeometry(rect);
488int QStackedLayout::heightForWidth(
int width)
const
490 const int n = count();
493 for (
int i = 0; i < n; ++i) {
494 if (QLayoutItem *item = itemAt(i)) {
495 if (QWidget *w = item->widget())
497
498
499
500
501
502 hfw = qMax(hfw, w->heightForWidth(width));
505 hfw = qMax(hfw, minimumSize().height());
541void QStackedLayout::setStackingMode(StackingMode stackingMode)
544 if (d->stackingMode == stackingMode)
546 d->stackingMode = stackingMode;
548 const int n = d->list.size();
552 switch (d->stackingMode) {
554 if (
const int idx = currentIndex())
555 for (
int i = 0; i < n; ++i)
556 if (QWidget *widget = d->list.at(i)->widget())
557 widget->setVisible(i == idx);
561 if (
const QWidget *widget = currentWidget())
562 geometry = widget->geometry();
563 for (
int i = 0; i < n; ++i)
564 if (QWidget *widget = d->list.at(i)->widget()) {
565 if (!geometry.isNull())
566 widget->setGeometry(geometry);
567 widget->setVisible(
true);