QStackedLayout隐式显示添加的小部件

时间:2015-05-28 21:36:57

标签: c++ qt qt5

考虑简单的应用

#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为空,则给定的窗口小部件将成为当前窗口小部件。

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

1 个答案:

答案 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();