Qt之容器控件(QMdiArea)
简述
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::SubWindowView | 0 | 显示带有窗口框架的子窗口(默认)。 |
QMdiArea::TabbedView | 1 | 在选项卡栏中显示带有选项卡的子窗口。 |
效果
在该模式下,setTabPositon、setTabShape、setTabClosable、setTabsMovable灯标签栏相关函数可用,具体效果见Qt之容器空间(QTabWidget)。
设置激活顺序
指定用于对由subWindowList()返回的子窗口列表进行排序的条件。排列窗口时,函数cascadeSubWindows()和tileSubWindows()遵循此顺序。
常量 | 值 | 描述 |
---|---|---|
QMdiArea::CreationOrder | 0 | 窗口按其创建顺序返回。 |
QMdiArea::StackingOrder | 1 | 窗口按其堆叠顺序返回,最上面的窗口在列表的最后。 |
QMdiArea::ActivationHistoryOrder | 2 | 窗口将按照它们被激活的顺序返回。 |
信号槽
槽
名称 | 描述 |
---|---|
activateNextSubWindow() | 激活下一个窗口 |
activatePreviousSubWindow() | 激活上一个窗口 |
cascadeSubWindows() | 级联排布子窗口 |
closeActiveSubWindow() | 关闭活动窗口 |
closeAllSubWindows() | 关闭所有窗口 |
setActiveSubWindow(QMdiSubWindow *window) | 设置特定窗口为活动窗口 |
testOption(QMdiArea::AreaOption option) const | 平铺排布子窗口 |
信号
名称 | 描述 |
---|---|
subWindowActivated(QMdiSubWindow *window) | 特定子窗口被激活时触发,参数为当前激活的QMdiSubWindow指针 |
引用
[1] Qt助手
更多推荐
所有评论(0)