MDI 应用程序就是在主窗口里创建多个同类型的 MDI 子窗口,这些 MDI 子窗口在主窗口里显示,并共享主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的 MDI 子窗口进行。
设计 MDI 应用程序需要在主窗口工作区放置一个 QMdiArea 作为子窗体的容器。
可视化方式创建一个基于 QWidget 的类 SubTestWindow
subtestwindow.h文件
#ifndef SubTestWindow_H
#define SubTestWindow_H
#include <QWidget>
namespace Ui {
class SubTestWindow;
}
class SubTestWindow : public QWidget
{
Q_OBJECT
public:
explicit SubTestWindow(QWidget *parent = nullptr);
~SubTestWindow();
private:
Ui::SubTestWindow*ui;
};
#endif // SubTestWindow_H
subtestwindow.cpp文件
#include "subtestwindow.h"
#include "ui_subtestwindow.h"
SubTestWindow::SubTestWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::SubTestWindow)
{
ui->setupUi(this);
}
SubTestWindow::~SubTestWindow()
{
delete ui;
}
创建主窗口框架MainWindow的类 mainwindow
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
class QMdiArea;
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool ActivateSubWindow(QString str);
private slots:
void on_actionPlayer_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp文件
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFile>
#include <QDebug>
#include <QMdiSubWindow>
#include "mainwindow.h"
#include "subtestwindow.h" //自定义的Qwidget类子窗口
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->mdiArea->setTabShape(QTabWidget::Rounded); // 设置table标签样式
ui->mdiArea->setTabsClosable(true); // 设置table标签有关闭按钮图标
ui->mdiArea->setViewMode(QMdiArea::TabbedView); // 设置table模式
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::ActivateSubWindow(QString str)
{
bool active = false;
QList<QMdiSubWindow *> swlst = ui->mdiArea->subWindowList();
for (int i=0; i < swlst.count(); i++)
{
QMdiSubWindow *sw = swlst.at(i);
if(sw->windowTitle()==str){ //查找是否已经创建
ui->mdiArea->setActiveSubWindow(sw);
active = true;
break;
}
}
return active;
}
void MainWindow::on_actionPlayer_triggered()
{
bool active = ActivateSubWindow("NewTest");
if (!active) //新建子窗口
{
SubTestWindow *w = new SubTestWindow (this);
QMdiSubWindow *sw = ui->mdiArea->addSubWindow(w); //添加子窗口到mdiarea容器中
sw->setWindowIcon(QIcon(":/main.jpeg"));
sw->show(); //显示子窗口
// w->show();
}
}