实现多个子窗体的自定义布局(自定义子窗体尺寸和位置)、平铺布局(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); //页面可关闭
}