本页内容

QMdiArea Class

QMdiArea 控件提供了一个用于显示 MDI 窗口的区域。更多内容...

标题: #include <QMdiArea>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QAbstractScrollArea

公共类型

enum AreaOption { DontMaximizeSubWindowOnActivation }
flags AreaOptions
enum ViewMode { SubWindowView, TabbedView }
enum WindowOrder { CreationOrder, StackingOrder, ActivationHistoryOrder }

属性

公共函数

QMdiArea(QWidget *parent = nullptr)
virtual ~QMdiArea()
QMdiArea::WindowOrder activationOrder() const
QMdiSubWindow *activeSubWindow() const
QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())
QBrush background() const
QMdiSubWindow *currentSubWindow() const
bool documentMode() const
void removeSubWindow(QWidget *widget)
void setActivationOrder(QMdiArea::WindowOrder order)
void setBackground(const QBrush &background)
void setDocumentMode(bool enabled)
void setOption(QMdiArea::AreaOption option, bool on = true)
void setTabPosition(QTabWidget::TabPosition position)
void setTabShape(QTabWidget::TabShape shape)
void setTabsClosable(bool closable)
void setTabsMovable(bool movable)
void setViewMode(QMdiArea::ViewMode mode)
QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order = CreationOrder) const
QTabWidget::TabPosition tabPosition() const
QTabWidget::TabShape tabShape() const
bool tabsClosable() const
bool tabsMovable() const
bool testOption(QMdiArea::AreaOption option) const
QMdiArea::ViewMode viewMode() const

重新实现的公共函数

virtual QSize minimumSizeHint() const override
virtual QSize sizeHint() const override

公共槽

信号

void subWindowActivated(QMdiSubWindow *window)

重新实现的受保护函数

virtual void childEvent(QChildEvent *childEvent) override
virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *object, QEvent *event) override
virtual void paintEvent(QPaintEvent *paintEvent) override
virtual void resizeEvent(QResizeEvent *resizeEvent) override
virtual void scrollContentsBy(int dx, int dy) override
virtual void showEvent(QShowEvent *showEvent) override
virtual void timerEvent(QTimerEvent *timerEvent) override
virtual bool viewportEvent(QEvent *event) override

受保护的槽

virtual void setupViewport(QWidget *viewport) override

详细说明

QMdiArea 的功能本质上类似于 MDI 窗口的窗口管理器。例如,它会在自身上绘制所管理的窗口,并以级联或平铺模式排列这些窗口。 QMdiArea通常被用作QMainWindow 中的中心控件来创建MDI应用程序,但也可以放置在任何布局中。以下代码向主窗口添加了一个区域:

QMainWindow *mainWindow = new QMainWindow;
mainWindow->setCentralWidget(mdiArea);

与顶级窗口的窗口管理器不同,只要当前控件样式支持这些标志,QMdiArea 便支持所有窗口标志(Qt::WindowFlags )。

QMdiArea 中的子窗口是QMdiSubWindow 的实例。它们通过addSubWindow() 添加到 MDI 区域中。通常会向该函数传递一个QWidget (将其设置为内部控件),但也可以直接传递一个QMdiSubWindow 。 该类继承自QWidget ,编程时可使用与普通顶级窗口相同的API。QMdiSubWindow 还具有MDI窗口特有的行为。更多详细信息请参阅QMdiSubWindow 类的描述。

子窗口在获得键盘焦点时,或调用setFocus()时,会成为活动窗口。用户可通过常规方式移动焦点来激活窗口。当活动窗口发生变化时,MDI区域会发出subWindowActivated()信号,而activeSubWindow()函数则返回当前的活动子窗口。

便捷函数subWindowList() 返回所有子窗口的列表。例如,此信息可用于包含窗口列表的弹出菜单中。

子窗口按当前的WindowOrder 进行排序。该排序机制用于subWindowList()、activateNextSubWindow()和activatePreviousSubWindow()函数。此外,在使用cascadeSubWindows()和tileSubWindows()对窗口进行级联或平铺布局时,也会用到该排序机制。

QMdiArea 为子窗口提供了两个内置的布局策略:cascadeSubWindows() 和tileSubWindows()。这两个都是插槽,可轻松与菜单条目关联。

按级联顺序排列的MDI窗口以平铺模式排列的MDI窗口

注意: QMdiArea 的默认滚动条属性 为Qt::ScrollBarAlwaysOff 。

另请参阅 QMdiSubWindow 。

成员类型文档

enum QMdiArea::AreaOption
flags QMdiArea::AreaOptions

此枚举描述了用于自定义QMdiArea 行为的选项。

常量值描述
QMdiArea::DontMaximizeSubWindowOnActivation0x1当活动子窗口被最大化时,默认行为是最大化接下来被激活的子窗口。如果您不希望出现这种行为,请设置此选项。

AreaOptions 类型是QFlags<AreaOption> 的 typedef 定义。它存储了 AreaOption 值的按“或”运算组合。

enum QMdiArea::ViewMode

此枚举描述了该区域的视图模式,即子窗口的显示方式。

常量值描述
QMdiArea::SubWindowView0以窗口边框显示子窗口(默认)。
QMdiArea::TabbedView1在标签栏中显示带有标签的子窗口。

另请参阅 setViewMode()。

enum QMdiArea::WindowOrder

指定用于对subWindowList() 返回的子窗口列表进行排序的标准。cascadeSubWindows() 和tileSubWindows() 函数在排列窗口时会遵循此顺序。

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

另请参阅 subWindowList()。

属性文档

activationOrder : WindowOrder

该属性存储子窗口列表的排序标准

该属性指定了由 `subWindowList()` 返回的子窗口列表的排序标准。默认情况下,排序依据为窗口创建顺序。

访问函数:

QMdiArea::WindowOrder activationOrder() const
void setActivationOrder(QMdiArea::WindowOrder order)

另请参阅 subWindowList()。

background : QBrush

该属性用于设置工作区的背景画笔

此属性用于设置工作区区域本身的背景画笔。默认情况下,背景颜色为灰色,但可以是任何类型的画笔(例如颜色、渐变或位图)。

访问函数:

QBrush background() const
void setBackground(const QBrush &background)

documentMode : bool

该属性用于指定在标签页视图模式下,标签栏是否设置为文档模式。

默认情况下,文档模式处于禁用状态。

访问函数:

bool documentMode() const
void setDocumentMode(bool enabled)

另请参阅 QTabBar::documentMode 和setViewMode()。

tabPosition : QTabWidget::TabPosition

该属性用于存储标签页视图模式下标签页的位置。

该属性的可能取值由QTabWidget::TabPosition 枚举定义。

访问函数:

QTabWidget::TabPosition tabPosition() const
void setTabPosition(QTabWidget::TabPosition position)

另请参阅 QTabWidget::TabPosition 和setViewMode()。

tabShape : QTabWidget::TabShape

该属性用于确定标签页视图模式下标签页的布局。

该属性的可能取值为QTabWidget::Rounded (默认)或QTabWidget::Triangular 。

访问函数:

QTabWidget::TabShape tabShape() const
void setTabShape(QTabWidget::TabShape shape)

另请参阅 QTabWidget::TabShape 和setViewMode()。

tabsClosable : bool

此属性用于控制在标签页视图模式下,标签栏是否应在每个标签页上显示关闭按钮。

默认情况下,标签页不可关闭。

访问函数:

bool tabsClosable() const
void setTabsClosable(bool closable)

另请参阅 QTabBar::tabsClosable 和setViewMode()。

tabsMovable : bool

该属性控制用户在标签页视图模式下是否可以在标签栏区域内移动标签页。

默认情况下,标签不可移动。

访问函数:

bool tabsMovable() const
void setTabsMovable(bool movable)

另请参阅 QTabBar::movable 和setViewMode()。

viewMode : ViewMode

该属性控制子窗口在QMdiArea 中的显示方式。

默认情况下,SubWindowView 用于显示子窗口。

访问函数:

QMdiArea::ViewMode viewMode() const
void setViewMode(QMdiArea::ViewMode mode)

另请参阅 ViewMode 、setTabShape() 和setTabPosition()。

成员函数文档

QMdiArea::QMdiArea(QWidget *parent = nullptr)

创建一个空的 MDI 区域。将parent 作为参数传递给QWidget 的构造函数。

[virtual noexcept] QMdiArea::~QMdiArea()

清除 MDI 区域。

[slot] void QMdiArea::activateNextSubWindow()

将键盘焦点移至子窗口列表中的另一个窗口。被激活的窗口将是根据当前activation order 确定的下一个窗口。

另请参阅 activatePreviousSubWindow()和QMdiArea::WindowOrder 。

[slot] void QMdiArea::activatePreviousSubWindow()

将键盘焦点移至子窗口列表中的另一个窗口。被激活的窗口将是根据当前activation order 确定的上一个窗口。

另请参阅 activateNextSubWindow()和QMdiArea::WindowOrder 。

QMdiSubWindow *QMdiArea::activeSubWindow() const

返回指向当前活动子窗口的指针。如果当前没有活动窗口,则返回nullptr 。

就窗口状态而言,子窗口被视为顶级窗口,即如果 MDI 区域外的某个控件是活动窗口,则没有任何子窗口处于活动状态。请注意,如果 MDI 区域所在窗口中的某个控件获得焦点,该窗口将被激活。

另请参阅 setActiveSubWindow() 和Qt::WindowState 。

QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())

将widget 作为新子窗口添加到MDI区域中。如果windowFlags 不为零,它们将覆盖小部件上设置的标志。

widget 该widget 可以是QMdiSubWindow ,也可以是另一个QWidget (在这种情况下,MDI区域将创建一个子窗口,并将该 设置为内部控件)。

注意: 子窗口添加后, 其父窗口将变为QMdiArea 的视口控件。

QMdiArea mdiArea;
QMdiSubWindow *subWindow1 = new QMdiSubWindow;
subWindow1->setWidget(internalWidget1);
subWindow1->setAttribute(Qt::WA_DeleteOnClose);
mdiArea.addSubWindow(subWindow1);

QMdiSubWindow *subWindow2 =
    mdiArea.addSubWindow(internalWidget2);

当您创建自己的子窗口时,如果希望该窗口在 MDI 区域中关闭时被删除,必须设置Qt::WA_DeleteOnClose 控件属性。否则,该窗口将被隐藏,且 MDI 区域不会激活下一个子窗口。

返回已添加到 MDI 区域的 `QMdiSubWindow `。

另请参阅 removeSubWindow()。

[slot] void QMdiArea::cascadeSubWindows()

将所有子窗口按级联模式排列。

另请参阅 tileSubWindows()。

[override virtual protected] void QMdiArea::childEvent(QChildEvent *childEvent)

重写了:QObject::childEvent(QChildEvent *event)。

[slot] void QMdiArea::closeActiveSubWindow()

关闭当前活动子窗口。

另请参阅 closeAllSubWindows()。

[slot] void QMdiArea::closeAllSubWindows()

通过向每个子窗口发送QCloseEvent ,关闭所有子窗口。在子窗口关闭之前,您可能会收到来自这些子窗口的subWindowActivated()信号(如果当另一个子窗口正在关闭时,MDI区域激活了该子窗口)。

忽略关闭事件的子窗口将保持打开状态。

另请参阅 closeActiveSubWindow()。

QMdiSubWindow *QMdiArea::currentSubWindow() const

返回指向当前子窗口的指针;若无当前子窗口,则返回nullptr 。

如果包含QMdiArea 的QApplication 处于活动状态,则该函数的返回值与activeSubWindow()相同。

另请参阅 activeSubWindow() 和QApplication::activeWindow()。

[override virtual protected] bool QMdiArea::event(QEvent *event)

重写了:QAbstractScrollArea::event(QEvent *event)。

[override virtual protected] bool QMdiArea::eventFilter(QObject *object, QEvent *event)

重写了:QObject::eventFilter(QObject *watched, QEvent *event)。

[override virtual] QSize QMdiArea::minimumSizeHint() const

重新实现了:QAbstractScrollArea::minimumSizeHint() const。

[override virtual protected] void QMdiArea::paintEvent(QPaintEvent *paintEvent)

重写了:QAbstractScrollArea::paintEvent(QPaintEvent *event)。

void QMdiArea::removeSubWindow(QWidget *widget)

将widget 从MDI区域中移除。widget 必须是QMdiSubWindow ,或者是一个作为子窗口内部控件的控件。注意:widget 实际上从未被QMdiArea 删除。如果传入的是QMdiSubWindow ,则将其父控件设置为nullptr 并将其移除;但如果传入的是内部控件,则将其子控件设置为nullptr ,且QMdiSubWindow 不会被移除。

另请参阅 addSubWindow()。

[override virtual protected] void QMdiArea::resizeEvent(QResizeEvent *resizeEvent)

重写了:QAbstractScrollArea::resizeEvent(QResizeEvent *event)。

[override virtual protected] void QMdiArea::scrollContentsBy(int dx, int dy)

重新实现了:QAbstractScrollArea::scrollContentsBy(int dx, int dy)。

[slot] void QMdiArea::setActiveSubWindow(QMdiSubWindow *window)

激活子窗口window 。如果window 的值为nullptr ,则当前任何活动窗口都将被停用。

另请参阅 activeSubWindow()。

void QMdiArea::setOption(QMdiArea::AreaOption option, bool on = true)

如果on 为真,则 MDI 区域中启用option ;否则,该功能被禁用。有关每个选项的效果,请参阅AreaOption 。

另请参阅 AreaOption 和testOption()。

[override virtual protected slot] void QMdiArea::setupViewport(QWidget *viewport)

重写:QAbstractScrollArea::setupViewport(QWidget *viewport)。

在调用setViewport()之后,QAbstractScrollArea 会调用此槽函数。请在QMdiArea 的子类中重写此函数,以便在viewport 被使用之前对其进行初始化。

另请参阅 setViewport()。

[override virtual protected] void QMdiArea::showEvent(QShowEvent *showEvent)

重写了:QWidget::showEvent(QShowEvent *event)。

[override virtual] QSize QMdiArea::sizeHint() const

重新实现了:QAbstractScrollArea::sizeHint() const。

[signal] void QMdiArea::subWindowActivated(QMdiSubWindow *window)

QMdiArea 在window 被激活后发出此信号。当window 的值为nullptr 时,QMdiArea 刚刚关闭了其最后一个活动窗口,且工作区上已无任何活动窗口。

另请参阅 QMdiArea::activeSubWindow()。

QList<QMdiSubWindow *> QMdiArea::subWindowList(QMdiArea::WindowOrder order = CreationOrder) const

返回 MDI 区域中所有子窗口的列表。 如果 `order ` 的值为 `CreationOrder `(默认值),则窗口按其插入工作区的顺序进行排序。如果 `order ` 的值为 `StackingOrder`,则窗口按其堆叠顺序列出,最顶部的窗口作为列表中的最后一项。如果 `order ` 的值为 `ActivationHistoryOrder`,则窗口按其最近的激活历史记录进行排序。

另请参阅 WindowOrder 。

bool QMdiArea::testOption(QMdiArea::AreaOption option) const

如果启用了option ,则返回true ;否则返回false 。

另请参阅 AreaOption 和setOption()。

[slot] void QMdiArea::tileSubWindows()

将所有子窗口以平铺模式排列。

另请参阅 cascadeSubWindows()。

[override virtual protected] void QMdiArea::timerEvent(QTimerEvent *timerEvent)

重写了:QObject::timerEvent(QTimerEvent *event)。

[override virtual protected] bool QMdiArea::viewportEvent(QEvent *event)

重写了:QAbstractScrollArea::viewportEvent(QEvent *event)。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.