QMdiArea Class

QMdiArea widget 提供了显示 MDI 窗口的区域。更多

Header: #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),只要当前 widget 风格支持这些标志。

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() 。这两种策略都是插槽,可轻松连接到菜单项。

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

另请参阅 QMdiSubWindow

成员类型文档

枚举 QMdiArea::AreaOption
flags QMdiArea::AreaOptions

该枚举描述了自定义QMdiArea 行为的选项。

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

AreaOptions 类型是QFlags<AreaOption> 的类型定义。它存储 AreaOption 值的 OR 组合。

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::documentModesetViewMode()。

tabPosition : QTabWidget::TabPosition

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

该属性的可能值由QTabWidget::TabPosition 枚举描述。

访问功能:

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

另请参阅 QTabWidget::TabPositionsetViewMode()。

tabShape : QTabWidget::TabShape

该属性用于保存标签页视图模式下标签页的形状。

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

访问功能:

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

另请参阅 QTabWidget::TabShapesetViewMode() 。

tabsClosable : bool

该属性用于确定在标签视图模式下,标签栏是否应在每个标签上放置关闭按钮。

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

访问功能:

bool tabsClosable() const
void setTabsClosable(bool closable)

另请参阅 QTabBar::tabsClosablesetViewMode()。

tabsMovable : bool

在标签视图模式下,用户是否可以移动标签栏区域内的标签。

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

访问功能:

bool tabsMovable() const
void setTabsMovable(bool movable)

另请参阅 QTabBar::movablesetViewMode()。

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 区域将创建一个子窗口,并将widget 设置为内部 widget)。

注意: 添加子窗口后,其父窗口将是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 widget 属性。否则,窗口将被隐藏,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

如果包含QMdiAreaQApplication 处于活动状态,则该函数的返回值与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)

从 MDI 区域移除widgetwidget 必须是QMdiSubWindow 或作为子窗口内部 widget 的 widget。注意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 。如果windownullptr ,则当前活动窗口将被停用。

另请参阅 activeSubWindow() 。

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

如果on 为 true,则在 MDI 区域启用option ;否则禁用。有关各选项的效果,请参见AreaOption

另请参阅 AreaOptiontestOption()。

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

重实现:QAbstractScrollArea::setupViewport(QWidget *viewport).

QAbstractScrollArea 在调用setViewport() 后调用此槽。在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 区域中所有子窗口的列表。如果orderCreationOrder (默认值),窗口将按插入工作区的顺序排序。如果orderStackingOrder ,窗口将按堆叠顺序排列,最上面的窗口为列表中的最后一项。如果orderActivationHistoryOrder ,窗口将根据其最近的激活历史记录列出。

另请参阅 WindowOrder

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

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

另请参阅 AreaOptionsetOption()。

[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).

© 2025 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.