本页内容

QMdiSubWindow Class

QMdiSubWindow 类为QMdiArea 提供了一个子窗口类。更多内容...

头文件: #include <QMdiSubWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QWidget

公共类型

enum SubWindowOption { RubberBandResize, RubberBandMove }
flags SubWindowOptions

属性

公共函数

QMdiSubWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
virtual ~QMdiSubWindow()
bool isShaded() const
int keyboardPageStep() const
int keyboardSingleStep() const
QMdiArea *mdiArea() const
void setKeyboardPageStep(int step)
void setKeyboardSingleStep(int step)
void setOption(QMdiSubWindow::SubWindowOption option, bool on = true)
void setSystemMenu(QMenu *systemMenu)
void setWidget(QWidget *widget)
QMenu *systemMenu() const
bool testOption(QMdiSubWindow::SubWindowOption option) const
QWidget *widget() const

重新实现的公共函数

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

公共插槽

void showShaded()
void showSystemMenu()

信号

void aboutToActivate()
void windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState)

重新实现的受保护函数

virtual void changeEvent(QEvent *changeEvent) override
virtual void childEvent(QChildEvent *childEvent) override
virtual void closeEvent(QCloseEvent *closeEvent) override
virtual void contextMenuEvent(QContextMenuEvent *contextMenuEvent) override
virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *object, QEvent *event) override
virtual void focusInEvent(QFocusEvent *focusInEvent) override
virtual void focusOutEvent(QFocusEvent *focusOutEvent) override
virtual void hideEvent(QHideEvent *hideEvent) override
virtual void keyPressEvent(QKeyEvent *keyEvent) override
virtual void leaveEvent(QEvent *leaveEvent) override
virtual void mouseDoubleClickEvent(QMouseEvent *mouseEvent) override
virtual void mouseMoveEvent(QMouseEvent *mouseEvent) override
virtual void mousePressEvent(QMouseEvent *mouseEvent) override
virtual void mouseReleaseEvent(QMouseEvent *mouseEvent) override
virtual void moveEvent(QMoveEvent *moveEvent) override
virtual void paintEvent(QPaintEvent *paintEvent) override
virtual void resizeEvent(QResizeEvent *resizeEvent) override
virtual void showEvent(QShowEvent *showEvent) override
virtual void timerEvent(QTimerEvent *timerEvent) override

详细说明

QMdiSubWindow 代表QMdiArea 中的顶级窗口,由带窗口装饰的标题栏、一个内部小部件以及(取决于当前样式)窗口边框和大小拖柄组成。QMdiSubWindow 具有自己的布局,该布局由标题栏和用于放置内部小部件的中心区域组成。

带有标题栏和内部控件的MDI窗口

构建 QMdiSubWindow 最常见的方式是调用QMdiArea::addSubWindow(),并将内部小部件作为参数传入。您也可以自行创建子窗口,并通过调用setWidget() 来设置内部小部件。

在编程时,子窗口与普通顶级窗口使用相同的 API(例如,您可以调用show()、hide()、showMaximized() 和setWindowTitle() 等函数)。

子窗口处理

QMdiSubWindow 还支持 MDI 区域中子窗口特有的行为。

默认情况下,每个 QMdiSubWindow 在 MDI 区域视口内移动时都是可见的,但也可以指定透明的窗口移动和调整大小行为,即在这些操作期间仅更新子窗口的轮廓。setOption() 函数用于启用此行为。

isShaded() 函数用于检测子窗口当前是否处于半透明状态(即窗口被折叠,仅显示标题栏)。要进入半透明模式,请调用showShaded()。 每当窗口状态发生变化时(例如,窗口被最小化或恢复时),QMdiSubWindow 都会发出windowStateChanged() 信号。此外,在窗口被激活之前,它还会发出aboutToActivate() 信号。

在键盘交互模式下,可通过键盘移动和调整窗口大小。您可以通过窗口的系统菜单进入此模式。keyboardSingleStep 和keyboardPageStep 属性控制每次按键事件中控件的移动或调整大小距离。按下 Shift 键时采用页面步长;否则采用单步。

您还可以通过键盘切换活动窗口。同时按下 Control 和 Tab 键,将激活下一个子窗口(根据当前的WindowOrder 设置);同时按下 Control、Shift 和 Tab 键,将激活上一个窗口。这相当于调用activateNextSubWindow() 和activatePreviousSubWindow() 函数。 请注意,这些快捷键会覆盖全局快捷键,但不会覆盖QMdiArea的快捷键。

另请参阅 QMdiArea 。

成员类型文档

enum QMdiSubWindow::SubWindowOption
flags QMdiSubWindow::SubWindowOptions

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

常量值描述
QMdiSubWindow::RubberBandResize0x4如果启用此选项,将使用橡皮筋控件来表示子窗口的轮廓,用户通过拖动该控件来调整大小,而不是直接拖动子窗口本身。因此,子窗口将保持其原始位置和大小,直到调整大小操作完成,此时它将收到一个QResizeEvent 。默认情况下,此选项处于禁用状态。
QMdiSubWindow::RubberBandMove0x8如果启用此选项,将使用一个“橡皮筋”控件来表示子窗口的轮廓,用户移动的是该控件而非子窗口本身。因此,子窗口将保持在原始位置,直到移动操作完成,此时会向窗口发送一个QMoveEvent 。默认情况下,此选项处于禁用状态。

SubWindowOptions 类型是QFlags<SubWindowOption> 的 typedef。它存储 SubWindowOption 值的按“或”运算组合。

属性文档

keyboardPageStep : int

设置在使用键盘页面键时,控件应移动或调整大小的距离。

在键盘交互模式下,您可以使用方向键和页键来移动或调整窗口大小。此属性用于控制页键的行为。进入键盘交互模式的常用方法是进入子窗口菜单,然后选择“调整大小”或“移动”。

默认的键盘页面键步长值为 20 像素。

访问函数:

int keyboardPageStep() const
void setKeyboardPageStep(int step)

另请参阅 keyboardSingleStep 。

keyboardSingleStep : int

设置在使用键盘方向键时,控件应移动或调整大小的距离。

在键盘交互模式下,您可以使用方向键和页面键来移动或调整窗口大小。此属性用于控制方向键的行为。进入键盘交互模式的常用方法是进入子窗口菜单,然后选择“调整大小”或“移动”。

键盘单步移动的默认值为 5 像素。

访问函数:

int keyboardSingleStep() const
void setKeyboardSingleStep(int step)

另请参阅 keyboardPageStep 。

成员函数文档

QMdiSubWindow::QMdiSubWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

创建一个新的 QMdiSubWindow 控件。parent 和flags 参数将传递给QWidget 的构造函数。

除了使用 addSubWindow() 之外,在将子窗口添加到QMdiArea 时,也可以直接使用setParent()。

请注意,只有QMdiSubWindow对象才能被设置为QMdiArea 的子窗口;例如,你不能这样写:

//bad code
QMdiArea mdiArea;
QTextEdit editor(&mdiArea); // invalid child widget

另请参阅 QMdiArea::addSubWindow()。

[virtual noexcept] QMdiSubWindow::~QMdiSubWindow()

销毁子窗口。

另请参阅 QMdiArea::removeSubWindow()。

[signal] void QMdiSubWindow::aboutToActivate()

QMdiSubWindow 在子窗口被激活之前会立即发出该信号。子窗口被激活后,管理该子窗口的QMdiArea 也会发出subWindowActivated()信号。

另请参阅 QMdiArea::subWindowActivated()。

[override virtual protected] void QMdiSubWindow::changeEvent(QEvent *changeEvent)

重写了:QWidget::changeEvent(QEvent *event)。

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

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

[override virtual protected] void QMdiSubWindow::closeEvent(QCloseEvent *closeEvent)

重写了:QWidget::closeEvent(QCloseEvent *event)。

[override virtual protected] void QMdiSubWindow::contextMenuEvent(QContextMenuEvent *contextMenuEvent)

重写:QWidget::contextMenuEvent(QContextMenuEvent *event)。

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

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

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

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

[override virtual protected] void QMdiSubWindow::focusInEvent(QFocusEvent *focusInEvent)

重写了:QWidget::focusInEvent(QFocusEvent *event)。

[override virtual protected] void QMdiSubWindow::focusOutEvent(QFocusEvent *focusOutEvent)

重写了:QWidget::focusOutEvent(QFocusEvent *event)。

[override virtual protected] void QMdiSubWindow::hideEvent(QHideEvent *hideEvent)

重写了:QWidget::hideEvent(QHideEvent *event)。

bool QMdiSubWindow::isShaded() const

如果该窗口处于折叠状态,则返回true ;否则返回false 。

如果窗口被折叠,仅显示标题栏,则该窗口处于折叠状态。

[override virtual protected] void QMdiSubWindow::keyPressEvent(QKeyEvent *keyEvent)

重写了:QWidget::keyPressEvent(QKeyEvent *event)。

[override virtual protected] void QMdiSubWindow::leaveEvent(QEvent *leaveEvent)

重写了:QWidget::leaveEvent(QEvent *event)。

QMdiArea *QMdiSubWindow::mdiArea() const

返回包含此子窗口的区域,如果不存在则返回nullptr 。

另请参阅 QMdiArea::addSubWindow()。

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

重新实现了属性QWidget::minimumSizeHint 的访问函数。

[override virtual protected] void QMdiSubWindow::mouseDoubleClickEvent(QMouseEvent *mouseEvent)

重写了:QWidget::mouseDoubleClickEvent(QMouseEvent *event)。

[override virtual protected] void QMdiSubWindow::mouseMoveEvent(QMouseEvent *mouseEvent)

重写了:QWidget::mouseMoveEvent(QMouseEvent *event)。

[override virtual protected] void QMdiSubWindow::mousePressEvent(QMouseEvent *mouseEvent)

重写了:QWidget::mousePressEvent(QMouseEvent *event)。

[override virtual protected] void QMdiSubWindow::mouseReleaseEvent(QMouseEvent *mouseEvent)

重写了:QWidget::mouseReleaseEvent(QMouseEvent *event)。

[override virtual protected] void QMdiSubWindow::moveEvent(QMoveEvent *moveEvent)

重写了:QWidget::moveEvent(QMoveEvent *event)。

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

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

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

重写:QWidget::resizeEvent(QResizeEvent *event)。

警告:在将 子窗口最大化或恢复时 ,由此引发的对该函数的调用可能会传入一个无效的QResizeEvent::oldSize() 参数。

void QMdiSubWindow::setOption(QMdiSubWindow::SubWindowOption option, bool on = true)

如果on 为真,则子窗口上启用了option ;否则,该功能被禁用。有关每个选项的作用,请参阅SubWindowOption 。

另请参阅 SubWindowOption 和testOption()。

void QMdiSubWindow::setSystemMenu(QMenu *systemMenu)

将systemMenu 设置为该子窗口的当前系统菜单。

默认情况下,每个QMdiSubWindow 都有一个标准系统菜单。

由QMdiSubWindow 创建的系统菜单中的 QActions 将根据当前窗口状态自动更新;例如,窗口最小化后,“最小化”操作将被禁用。

QMdiSubWindow 不会更新用户添加的 QActions。

QMdiSubWindow systemMenu 会接管所有权;您无需将其删除。任何现有的菜单都将被删除。

另请参阅 systemMenu() 和showSystemMenu()。

void QMdiSubWindow::setWidget(QWidget *widget)

将widget 设置为该子窗口的内部小部件。内部小部件显示在子窗口标题栏下方的中央位置。

QMdiSubWindow 临时接管widget 的所有权;您无需将其删除。任何现有的内部控件都将被移除,并重新关联到根窗口。

另请参阅 widget()。

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

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

[slot] void QMdiSubWindow::showShaded()

调用此函数会使子窗口进入阴影模式。当子窗口处于阴影模式时,仅显示标题栏。

尽管并非所有样式都支持遮蔽模式,但无论是否支持遮蔽,该函数仍会将子窗口显示为遮蔽状态。不过,若与不支持遮蔽的样式配合使用,用户将无法通过用户界面(例如标题栏中的遮蔽按钮)退出遮蔽模式。

另请参阅 isShaded()。

[slot] void QMdiSubWindow::showSystemMenu()

在标题栏的系统菜单图标下方显示系统菜单。

另请参阅 setSystemMenu() 和systemMenu()。

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

重新实现了属性QWidget::sizeHint 的访问函数。

QMenu *QMdiSubWindow::systemMenu() const

返回指向当前系统菜单的指针;如果未设置系统菜单,则返回零。QMdiSubWindow 提供了一个默认系统菜单,但您也可以使用setSystemMenu() 来设置菜单。

另请参阅 setSystemMenu() 和showSystemMenu()。

bool QMdiSubWindow::testOption(QMdiSubWindow::SubWindowOption option) const

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

另请参阅 SubWindowOption 和setOption()。

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

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

QWidget *QMdiSubWindow::widget() const

返回当前的内部控件。

另请参阅 setWidget()。

[signal] void QMdiSubWindow::windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState)

QMdiSubWindow 在窗口状态发生变化后发出此信号。oldState 表示状态变化前的窗口状态,newState 表示新的、当前的状态。

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