考虑简单的应用
#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
显示此小部件,其可能与以下内容相符:
如果在调用此函数之前
QStackedLayout
为空,则给定的窗口小部件将成为当前窗口小部件。
这应该是那样的吗?我如何摆脱这种违反直觉的行为?这是我发现的唯一一种布局。
答案 0 :(得分:3)
这应该是那样的吗?
我怀疑QStackedLayout类的作者从未考虑过有人将顶层窗口小部件放入布局的可能性。这似乎是一件奇怪的事情。
关于意图:尽管没有与作者交谈,但我们能做的最好的事情是查看qstackedlayout.cpp中的代码。我看到QStackedLayout :: addWidget()调用QStackedLayout :: insertWidget(),它调用QStackedLayout :: setCurrentIndex(),它在窗口小部件上调用show();这可以解释为什么你的QLabel变得可见。
如何摆脱这种违反直觉的行为?
通常在Qt程序中,您不会将您的顶级窗口小部件添加到布局中。相反,您将创建自己独立的顶级窗口小部件,创建与其关联的布局,然后将子窗口小部件添加到布局中,如下所示:
QWidget topWidget;
QStackedLayout * stack = new QStackedLayout(&topWidget);
stack->addWidget(new QLabel("Calls QLabel::show()?"));
return app.exec();