QStackedLayout隐式显示添加的小部件

QStackedLayout implicitly shows added widget

本文关键字:小部 添加 显示 QStackedLayout      更新时间:2023-10-16

考虑到简单的应用

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

with qmake project

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

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

一致:

如果在调用此函数之前QStackedLayout为空,则给定的小部件成为当前小部件。

这应该是这样工作吗?我怎样才能摆脱这种违反直觉的行为呢?

这应该是这样工作吗?

我怀疑QStackedLayout类的作者从来没有考虑过有人在布局中放置顶级小部件的可能性。这似乎是一件奇怪的事情。

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

我如何摆脱这种违反直觉的行为?

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

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