简述

QMdiArea(Multiple Document Interface Area)提供了一个可以同时显示多个文档窗口的区域。

本质上来说,QMdiArea就像是多文档窗口的窗口管理器。例如,它将它所管理的窗口绘制在它上面,并且以级联或者平铺的方式放置这些窗口。通常情况下,QMdiArea用作QMainWindow的中心控件,以此来创建一个MDI应用程序。但是,它也可以被放置在任何布局类中。

QMdiArea支持所有的窗口标志,只要这些窗口标志被当前控件样式支持。

功能详述

QMdiArea中的子窗口是QMdiSubWindow的实例化对象。通过调用addSubWindow来将他们加入MDI区域。通常情况下是传递一个QWidget作为内部控件给这个函数。但是直接传递QMdiSubWindow也是可以的。

当一个子窗口获得键盘焦点或者setFocus被调用,这个子窗口便被激活。当激活窗口改变时,subWindowActivated信号会被触发。activeSubWindow函数会返回当前激活的窗口。

subWindowList是一个十分方便的函数,可以用来返回所有子窗口列表。这个信息可以被用在包含窗口列表的弹出菜单上面。

WindowOrder用来指定子窗口的排列规则。子窗口的排列规则直接影响到subWindowList()、activateNextSubWindow()以及activatePreviousSubWindow()。而且,当窗口使用级联或者平铺时,这个信息也很有用。

QMdiArea为子窗口提供了两个内建的布局策略:cascadeSubWindows()和tileSubWindows()。这两个策略都是槽函数而且很容易与菜单条目连接。

注意 QMdiArea的默认滚动条属性是Qt::ScrolBarAlwaysOff。

使用

上面是Qt Designer的设计窗口,这种多窗口效果多半就是用QMdiArea实现的。

上面是Qt自带的example,用于实现多文本窗口同时编辑。

这是我自己写的小例子,源码如下

    QGroupBox *groupBox_0 = new QGroupBox("互斥单选按钮组");
    QRadioButton *radioBtn_0 = new QRadioButton("&Radio Button 1");
    QRadioButton *radioBtn_1 = new QRadioButton("R&adio Button 2");
    QRadioButton *radioBtn_2 = new QRadioButton("Ra&dio Button 3");
    QVBoxLayout *vLayout_0 = new QVBoxLayout;
    vLayout_0->addWidget(radioBtn_0);
    vLayout_0->addWidget(radioBtn_1);
    vLayout_0->addWidget(radioBtn_2);
    groupBox_0->setLayout(vLayout_0);

    QGroupBox *groupBox_1 = new QGroupBox("非互斥多选按钮组");
    QCheckBox *checkBox_0 = new QCheckBox("&Checkbox 1");
    QCheckBox *checkBox_1 = new QCheckBox("C&heckbox 2");
    QCheckBox *checkBox_2 = new QCheckBox("&Tri-state Button");
    checkBox_2->setTristate(true);
    QVBoxLayout *vLayout_1 = new QVBoxLayout;
    vLayout_1->addWidget(checkBox_0);
    vLayout_1->addWidget(checkBox_1);
    vLayout_1->addWidget(checkBox_2);
    groupBox_1->setLayout(vLayout_1);

    QMdiArea *mdiArea = new QMdiArea;
    mdiArea->tileSubWindows();
    mdiArea->cascadeSubWindows();
    mdiArea->setDocumentMode(true);

    mdiArea->addSubWindow(groupBox_0);
    mdiArea->addSubWindow(groupBox_1);

    QMainWindow *mainWindow = new QMainWindow;

    mainWindow->setCentralWidget(mdiArea);

    QGridLayout *gridLayout = new QGridLayout;
    gridLayout->addWidget(mainWindow);

    this->setLayout(gridLayout);

常用设置

添加与移除子窗口

添加子窗口使用addSubWindow,移除窗口使用removeSubWindow

mdiArea->addSubWindow(groupBox_0);
mdiArea->removeSubWindow(groupBox_0);

设置背景色

工作空间背景色默认为灰色,可以使用setBackground来设置

mdiArea->setBackground(QBrush(Qt::green));

效果

设置最大化模式

当活动子窗口最大化时,默认行为是最大化下一个激活的子窗口。如果不希望出现这种情况,可以通过下面的方法来设置

mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation);

默认情况

设置之后

设置视图模式

有两种视图模式,可以通过setViewMode来设置。

常量描述
QMdiArea::SubWindowView0显示带有窗口框架的子窗口(默认)。
QMdiArea::TabbedView1在选项卡栏中显示带有选项卡的子窗口。

效果

在该模式下,setTabPositon、setTabShape、setTabClosable、setTabsMovable灯标签栏相关函数可用,具体效果见Qt之容器空间(QTabWidget)

设置激活顺序

指定用于对由subWindowList()返回的子窗口列表进行排序的条件。排列窗口时,函数cascadeSubWindows()和tileSubWindows()遵循此顺序。

常量描述
QMdiArea::CreationOrder0窗口按其创建顺序返回。
QMdiArea::StackingOrder1窗口按其堆叠顺序返回,最上面的窗口在列表的最后。
QMdiArea::ActivationHistoryOrder2窗口将按照它们被激活的顺序返回。

信号槽

名称描述
activateNextSubWindow()激活下一个窗口
activatePreviousSubWindow()激活上一个窗口
cascadeSubWindows()级联排布子窗口
closeActiveSubWindow()关闭活动窗口
closeAllSubWindows()关闭所有窗口
setActiveSubWindow(QMdiSubWindow *window)设置特定窗口为活动窗口
testOption(QMdiArea::AreaOption option) const平铺排布子窗口

信号

名称描述
subWindowActivated(QMdiSubWindow *window)特定子窗口被激活时触发,参数为当前激活的QMdiSubWindow指针

引用

[1] Qt助手

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐