实现多个子窗体的自定义布局(自定义子窗体尺寸和位置)、平铺布局(titleSubWindows)和分页模式(QMdi::TabbedView)。
运行效果图
初始布局(自定义布局)
平铺布局
多页模式
实现过程
1. 创建项目MdiFirstDemo,并创建3个子窗体,分别为FirstSubWindow、SecondSubWindow和ThirdSubWindow。
2. 在主窗体MdiFirstDemo.ui中添加三个按钮和一个MDI Area控件,设置三个按钮水平布局,三个按钮和MDI Area垂直布局。?
1. 在MdiFirstDemo.h中声明子窗体对象和初始化函数
? ? FirstSubWindow *firstSubWindow;??SecondSubWindow *secondSubWindow;
? ? ThirdSubWindow *thirdSubWindow;
? ? void InitWindow();
? ? void InitSubWindows();
? ? 在MdiFirstDemo.cpp中添加函数定义
??? void MdiFirstDemo::InitWindow()
??? {
??????? ui.mdiArea->setFixedWidth(1000);
??????? ui.mdiArea->setFixedHeight(800);
??? }
??? void MdiFirstDemo::InitSubWindows()
??? {
??????? firstSubWindow = new FirstSubWindow(this);
??????? secondSubWindow = new SecondSubWindow(this);
??????? thirdSubWindow = new ThirdSubWindow(this);
??????? ui.mdiArea->addSubWindow(firstSubWindow);
??????? ui.mdiArea->addSubWindow(secondSubWindow);
??????? ui.mdiArea->addSubWindow(thirdSubWindow);
}
public slots:
void on_pBtnInitLayout_clicked();
void on_pBtnTile_clicked();
void on_pBtnTabbedView_clicked();
在MdiFirstDemo.cpp中添加槽函数定义
??? void MdiFirstDemo::on_pBtnInitLayout_clicked()
??? {
??????? ui.mdiArea->setViewMode(QMdiArea::SubWindowView);
??????? ResizeSubWindows();
??? }
??? //上面调用函数定义如下
??? void MdiFirstDemo::ResizeSubWindows()
??? {
??????? int mdiAreaWidth = ui.mdiArea->width();
??????? int mdiAreaHeight = ui.mdiArea->height();
??????? int unitWidth = mdiAreaWidth / 3;
??????? int unitHeight = mdiAreaHeight / 2;
??????? for (int i = 0; i < ui.mdiArea->subWindowList().size(); i++)
??????? {
??????????? //索引得到的子窗口顺序跟添加时顺序一致
??? ??????? QMdiSubWindow *s = ui.mdiArea->subWindowList().at(i);
??????????? //只知道这种方法可以改变子窗体尺寸
??????????? if (i == 0)
??????????? {
??????????????? QSize size(unitWidth, unitHeight);
??????????????? s->resize(size);
??????????????? s->move(0,0);
??????????? }
??????????? else if (i == 1)
??????????? {
??????????????? QSize size(unitWidth*2, unitHeight);
??????????????? s->resize(size);
??????????????? s->move(unitWidth, 0);
??????????? }
??????????? else if (i == 2)
??????????? {
??????????????? QSize size(mdiAreaWidth, unitHeight);
??????????????? s->resize(size);
??????????????? s->move(0, unitHeight);
??????????? }
??????? }
??? }
??? //平铺布局
??? void MdiFirstDemo::on_pBtnTile_clicked()
??? {
??????? //先设置为子窗口模式,在平铺布局,防止不同显示方式叠加
??????? ui.mdiArea->setViewMode(QMdiArea::SubWindowView);
??????? ui.mdiArea->tileSubWindows();
??? }
??? //多页显示
??? void MdiFirstDemo::on_pBtnTabbedView_clicked()
??? {
??????? ui.mdiArea->setViewMode(QMdiArea::TabbedView);
??????? ui.mdiArea->setTabsClosable(true); //页面可关闭
}