在模块后面加上 -private
关键字,例如 widgets-private
然后 qmake
让配置文件运行一下。
在使用 QStackedLayout 布局并设置 QStackedLayout::StackAll 模式,且没有设置 QStackedLayout 父对象,则会默认显示最后一个元素,但内部下标还是 0,即栈底
// 添加元素
int QStackedLayout::addWidget(QWidget *widget)
{
Q_D(QStackedLayout);
return insertWidget(d->list.count(), widget);
}
int QStackedLayout::insertWidget(int index, QWidget *widget)
{
Q_D(QStackedLayout);
addChildWidget(widget);
index = qMin(index, d->list.count());
if (index < 0)
index = d->list.count();
QWidgetItem *wi = QLayoutPrivate::createWidgetItem(this, widget);
d->list.insert(index, wi);
invalidate();
if (d->index < 0) {
setCurrentIndex(index);
} else {
if (index <= d->index)
++d->index;
if (d->stackingMode == StackOne)//判断显示模式
widget->hide();
widget->lower();//元素沉底
}
return index;
}
void QWidget::lower()
{
Q_D(QWidget);
if (!isWindow()) {//判断是否是 window 类型,这里不走这里
QWidget *p = parentWidget();
const int parentChildCount = p->d_func()->children.size();
if (parentChildCount < 2)
return;
const int from = p->d_func()->children.indexOf(this);
Q_ASSERT(from >= 0);
// Do nothing if the widget is already in correct stacking order _and_ created.
if (from != 0)
p->d_func()->children.move(from, 0);
if (!testAttribute(Qt::WA_WState_Created) && p->testAttribute(Qt::WA_WState_Created))
create();
else if (from == 0)
return;
}
if (testAttribute(Qt::WA_WState_Created))
d->lower_sys();//进入这里
if (d->extra && d->extra->hasWindowContainer)
QWindowContainer::parentWasLowered(this);
QEvent e(QEvent::ZOrderChange);
QApplication::sendEvent(this, &e);
}
void QWidgetPrivate::lower_sys()
{
Q_Q(QWidget);
if (q->isWindow() || q->testAttribute(Qt::WA_NativeWindow)) {
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
q->windowHandle()->lower();
} else if (QWidget *p = q->parentWidget()) {//判断父元素是否为空,上面问题因为没带入父指针,所以这里元素并没有进行沉底操作,所以才会出现上面那种情况.
setDirtyOpaqueRegion();
p->d_func()->invalidateBuffer(effectiveRectFor(q->geometry()));
}
}
原文:https://www.cnblogs.com/cheungxiongwei/p/11731566.html