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();
考虑简单的应用
#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();