Qt Widgets C++ — Main Window and Related Classes — QMdiArea
QMdiArea视图模式介绍
QMdiArea的功能本质上类似于MDI窗口的窗口管理器。例如,它绘制自己管理的窗口,并以层叠或平铺模式排列它们。QMdiArea通常用作QMainWindow中的中心小部件来创建MDI应用程序,但也可以放置在任何布局中。
想要了解QMdiArea的使用,首先我们的了解他的两种视图模式,即:子窗体模式和标签模式,两者的显示样式风别如下:
- 子窗体模式
- 标签模式
在QMdiArea中,
-
通过如下枚举定义视图模式: enum QMdiArea::ViewMode QMdiArea::SubWindowView 0 子窗体模式(默认模式) QMdiArea::TabbedView 1 标签模式,标签选项卡模式 -
通过如下函数获取和修改视图模式 QMdiArea::ViewMode viewMode() const 获取当前视图模式 void setViewMode(QMdiArea::ViewMode mode) 设置修改视图模式
// 修改视图模式试列代码
QMdiArea::ViewMode viewmode = qMdiArea->viewMode();
switch (viewmode)
{
case QMdiArea::SubWindowView:
{
qMdiArea->setViewMode(QMdiArea::TabbedView);
}
break;
case QMdiArea::TabbedView:
{
qMdiArea->setViewMode(QMdiArea::SubWindowView);
}
break;
default:
break;
}
QMdiArea标签(选项卡)模式下相关成员属性介绍
接下来我们来介绍一下QMdiArea类中的一些只有在标签(选项卡)模式下才起作用的一些成员属性 注意:接下来这些成员属性只有在标签(选项卡)模式下才起作用
- tabsClosable : bool
此属性用于确定选项卡栏是否应在选项卡式视图模式下的每个选项卡上放置关闭按钮。默认情况下,选项卡不可关闭。 访问功能函数如下: bool tabsClosable() const 获取tabsClosable 当前值 void setTabsClosable(bool closable) 设置修改tabsClosable 当前值 - tabsMovable : bool
此属性用于确定用户是否可以在选项卡式视图模式下在选项卡栏区域内移动选项卡。默认情况下,选项卡不可移动。 访问功能函数如下: bool tabsMovable() const 获取tabsMovable 当前值 void setTabsMovable(bool movable) 设置修改tabsMovable 当前值 - documentMode : bool
此属性用于保存选项卡栏在选项卡式视图模式下是否设置为文档模式。默认情况下禁用文档模式。 访问功能函数如下: bool documentMode() const 获取documentMode 当前值 void setDocumentMode(bool enabled) 设置修改documentMode 当前值 - tabPosition : QTabWidget::TabPosition
此属性在选项卡式视图模式下保留选项卡的位置。此属性的可能值由QTabWidget::TabPosition枚举描述。 访问功能函数如下: QTabWidget::TabPosition tabPosition() const void setTabPosition(QTabWidget::TabPosition position) - tabShape : QTabWidget::TabShape
此属性在选项卡式视图模式下保留选项卡的形状。 此属性的可能值为QTabWidget::Rounded(默认)或QTabWidget::Triangal。 访问功能函数如下: QTabWidget::TabShape tabShape() const void setTabShape(QTabWidget::TabShape shape)
QMdiArea常用成员函数介绍
- QMdiSubWindow *QMdiArea::currentSubWindow() const
返回指向当前子窗口的指针,如果没有当前子窗口,则返回nullptr。 如果包含QMdiArea的QApplication处于活动状态,则此函数将返回与activeSubWindow()相同的结果。 - QMdiSubWindow *QMdiArea::activeSubWindow() const
返回指向当前活动子窗口的指针。如果当前没有活动的窗口,则返回nullptr。就窗口状态而言,子窗口被视为顶级窗口,即,如果MDI区域外的小部件是活动窗口,则没有子窗口处于活动状态。请注意,如果MDI区域所在窗口中的小部件获得焦点,该窗口将被激活。 - QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())
将小部件作为新的子窗口添加到MDI区域。如果windowFlags为非零,则它们将覆盖小部件上设置的标志。小部件可以是QMdiSubWindow 或其他QWidget(在这种情况下,MDI区域将创建一个子窗口并将小部件设置为内部小部件)。注意:添加子窗口后,其父窗口将是QMdiArea的视口小部件。创建自己的子窗口时,如果希望在MDI区域中关闭窗口时删除该窗口,则必须设置Qt::WA_DeleteOnClose 小部件属性。否则,窗口将被隐藏,MDI区域将不会激活下一个子窗口。返回添加到MDI区域的QMdiSubWindow。 - void QMdiArea::removeSubWindow(QWidget *widget)
从MDI区域删除小部件。小部件必须是QMdiSubWindow 或子窗口的内部小部件。注意QMdiArea从未实际删除小部件。如果传入了QMdiSubWindow ,则其父级设置为nullptr,并将其删除;但是,如果传入了内部小部件,则子小部件将设置为nullptr,并且不会删除 - QMdiSubWindowQList<QMdiSubWindow *> QMdiArea::subWindowList(QMdiArea::WindowOrder order = CreationOrder) const
返回MDI区域中所有子窗口的列表。如果order是CreationOrder(默认设置),则窗口将按照其插入工作区的顺序进行排序。如果顺序为StackingOrder,则窗口将按其堆叠顺序列出,最上面的窗口是列表中的最后一项。如果顺序为ActivationHistoryOrder,则将根据其最近的激活历史记录列出窗口 - void QMdiArea::setActiveSubWindow(QMdiSubWindow *window)
激活子窗口窗口。如果窗口为nullptr,则会停用任何当前活动窗口。 - void QMdiArea::closeActiveSubWindow()
关闭所有激活的子窗体 - void QMdiArea::closeAllSubWindows()
通过向每个窗口发送QCloseEvent来关闭所有子窗口。在关闭子窗口之前,您可能会收到来自子窗口的subWindowActivated()信号(如果MDI区域在另一个窗口关闭时激活子窗口)。忽略关闭事件的子窗口将保持打开状态。 - void QMdiArea::activateNextSubWindow()
将键盘焦点提供给子窗口列表中的另一个窗口。激活的窗口将是当前激活顺序确定的下一个窗口。 - void QMdiArea::activatePreviousSubWindow()
将键盘焦点提供给子窗口列表中的另一个窗口。激活的窗口将是由当前激活顺序确定的前一个窗口。
//示例代码
// QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())
RLQGraphicsView * pRLQGraphicsView = new RLQGraphicsView();
pRLQGraphicsView->setWindowTitle("TTT");
qMdiArea->addSubWindow(pRLQGraphicsView);
// qMdiArea->addSubWindow(pRLQGraphicsView, Qt::WindowSystemMenuHint);
// qMdiArea->addSubWindow(pwidget, Qt::CustomizeWindowHint);
// qMdiArea->addSubWindow(pRLQGraphicsView, Qt::WindowSystemMenuHint | Qt::CustomizeWindowHint);
pRLQGraphicsView->show();
// QMdiSubWindowQList<QMdiSubWindow *> QMdiArea::subWindowList(QMdiArea::WindowOrder order = CreationOrder) const
QList<QMdiSubWindow *> sublist = qMdiArea->subWindowList();
for (QList<QMdiSubWindow *>::iterator iter = sublist.begin(); iter != sublist.end(); iter++)
{
QMdiSubWindow * p = *iter;
p->show();
}
QMdiArea信号
- void QMdiArea::subWindowActivated(QMdiSubWindow *window)
QMdiArea在激活窗口后发出此信号。当窗口为nullptr时,QMdiArea刚刚停用了其最后一个活动窗口,并且工作区上没有活动窗口。
// 示例代码
connect(qMdiArea, &QMdiArea::subWindowActivated, this,&RLQMdiArea::RLsubWindowActivated);
|