QStackedLayout 隐式显示添加的小部件

QStackedLayout implicitly shows added widget

考虑简单的应用

#include <QtWidgets>
int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QStackedLayout stack;
    stack.addWidget(new QLabel("Calls QLabel::show()?"));
    return app.exec();
}

使用 qmake 项目

TEMPLATE = app
TARGET = main
QT += widgets
CONFIG += c++11
SOURCES += main.cpp

人们会凭直觉期望没有任何 UI 的应用程序,因为 QWidget::show 没有在任何小部件上调用。然而,添加的标签将被显示,这导致假设 QStackedLayout::addWidget 显示了这个小部件,它可能与:

一致

If the QStackedLayout is empty before this function is called, the given widget becomes the current widget.

这应该是这样吗?我如何摆脱这种违反直觉的行为?这是我发现的唯一一种布局方式。

Is this supposed to work that way?

我怀疑 QStackedLayout class 的作者从未考虑过有人将顶级小部件放入布局中的可能性。想做这件事似乎很奇怪。

关于意图:不过,在不与作者交谈的情况下,我们能做的最好的事情就是查看 qstackedlayout.cpp 中的代码。我看到 QStackedLayout::addWidget() 调用 QStackedLayout::insertWidget(),后者调用 QStackedLayout::setCurrentIndex(),后者调用小部件上的 show();这将解释为什么您的 QLabel 变得可见。

How do I get rid of this counterintuitive behaviour?

通常在 Qt 程序中,您不会将顶级小部件 addChild() 添加到布局中。相反,您将创建自己的独立顶级小部件,创建与其关联的布局,然后将子小部件添加到布局,如下所示:

QWidget topWidget;
QStackedLayout * stack = new QStackedLayout(&topWidget);
stack->addWidget(new QLabel("Calls QLabel::show()?"));
return app.exec();