C++ Qt创建MDI文档窗口
我正在尝试创建一个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(
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();
}