注意多窗体和MDI 窗体是不一样的。
void MainWindow::newFile()
{
MainWindow *mainWin = new MainWindow;
mainWin->show();
}
看起来有点奇怪,我们没有保存new 出来的指针,但这不是问题,因为Qt 会跟踪所有的窗口。
QApplication::closeAllWindows() slot 会关闭所有应用程序窗口,除非它们其中一个拒绝close 事件。
MainWindow::MainWindow()
{
...
setAttribute(Qt::WA_DeleteOnClose);
...
}
关闭窗口默认是隐藏,但是不会删除。可以通过设置属性Qt::WA_DeleteOnClose 使得关闭窗体时删除窗体。
多窗体存在的问题是:每一个窗体都拥有独立的"最近打开文件" 列表,还有独立的Option 设置。要解决这个问题很简单,将recentFiles 成员声明成static 既可。
foreach (QWidget *win, QApplication::topLevelWidgets()) {
if (MainWindow *mainWin = qobject_cast<MainWindow *>(win))
mainWin->updateRecentFileActions();
}
遍历窗体更新每一个窗体的"最近打开文件" 列表,这是必需做的。还有,一个窗体的Option 改变时(如选中Show Grid)其它窗体也要一起改变,这也需要遍历窗体。
另外,还要保证同一个文件不能被两个窗体同时打开。