C++ Qt创建MDI文档窗口

C++ Qt创建MDI文档窗口,c++,qt,mdi,C++,Qt,Mdi,我正在尝试创建一个MDI文档程序。我有一个关于创建子窗口的问题 这是我的主窗口构造函数: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowTitle(tr("MDI")); workspace = new QMdiArea; setCentralWidget(

我正在尝试创建一个MDI文档程序。我有一个关于创建子窗口的问题

这是我的主窗口构造函数:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle(tr("MDI"));

    workspace = new QMdiArea;
    setCentralWidget(workspace);
    //fileNew();

    createActions();
    createMenus();
    createToolbars();

    statusBar()->showMessage(tr("Done"));

    enableActions();
}
有趣的一点是
fileNew()函数。这是一个私有插槽函数,我想在触发“新建文件”按钮时调用它。以下是专用插槽
fileNew()
函数:

void MainWindow::fileNew()
{
    DocumentWindows* document = new DocumentWindows;
    workspace->addSubWindow(document);
}
当我从主窗口构造函数调用时,这个函数工作得非常好。但是,当我从
createActions()调用它时,出现了一个问题使用信号插槽机制的功能

这是我的
createActions()

即使已触发插槽,也不会创建子窗口。随后,我发现如果我添加
document->show(),一切正常

void MainWindow::fileNew()
{
    DocumentWindows* document = new DocumentWindows;
    workspace->addSubWindow(document);
    document->show();
}
我的问题是:为什么插槽中需要
show()
函数,而构造函数中不需要


PS.
DocumentWindows
只是一个类继承了
QTextEdit

这个问题与所使用的小部件的类无关。它与文档、MDI或主窗口无关。将子窗口小部件添加到已可见的窗口小部件后,必须显式显示它。否则,小部件将保持隐藏状态

默认情况下,所有小部件都是隐藏的。当您最初
显示
主窗口时,其所有子窗口也会递归显示。稍后添加子MDI小部件时,它将保持隐藏状态。将小部件添加到布局时,默认情况下会显示它们,但小部件由MDI区域管理,而不是由布局管理

这是一个演示您的问题的最小测试用例:

// https://github.com/KubaO/stackoverflown/tree/master/questions/widget-show-32534931
#include <QtWidgets>

int main(int argc, char ** argv) {
    QApplication app{argc, argv};
    QWidget w;
    w.setMinimumSize(200, 50);
    QLabel visible{"Visible", &w};
    w.show();
    QLabel invisible{"Invisible", &w};
    invisible.move(100, 0);
    return app.exec();
}
//https://github.com/KubaO/stackoverflown/tree/master/questions/widget-show-32534931
#包括
int main(int argc,字符**argv){
QApplication app{argc,argv};
qw;
w、 setMinimumSize(200,50);
QLabel可见{“可见”,&w};
w、 show();
QLabel不可见{“不可见”,&w};
不可见。移动(100,0);
返回app.exec();
}
// https://github.com/KubaO/stackoverflown/tree/master/questions/widget-show-32534931
#include <QtWidgets>

int main(int argc, char ** argv) {
    QApplication app{argc, argv};
    QWidget w;
    w.setMinimumSize(200, 50);
    QLabel visible{"Visible", &w};
    w.show();
    QLabel invisible{"Invisible", &w};
    invisible.move(100, 0);
    return app.exec();
}