QT6 源,七章对话框与多窗体(17)用于辅助多文档 MDI 窗体设计 QMdiArea 的类 QMdiSubWindow:
(1)本类的继承关系如下 :
(2)本类是配合 QMdiArea 类来使用的。因为还没有学习 QMdiArea。对本类的测试也不会太到位。只能结合学过的知识来举例测试。
本类的属性很少 :
(3)本类的公共成员函数 :
++测试一下 :
++继续 :
(4)本类的信号函数 :
(5) 本类的槽函数 :
++本类的代码完毕。本类的使用,主要还是要结合 QMdiArea 才可以更好的理解。
(6) 本类定义于头文件 qmdisubwindow . h :
#ifndef QMDISUBWINDOW_H
#define QMDISUBWINDOW_H#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qwidget.h>QT_REQUIRE_CONFIG(mdiarea);QT_BEGIN_NAMESPACEclass QMenu;
class QMdiArea;namespace QMdi { class ControlContainer; }class QMdiSubWindowPrivate;/*
The QMdiSubWindow class provides a subwindow class for QMdiArea.Detailed Description :
QMdiSubWindow表示QMdiArea中的顶级窗口,并包含带有窗口装饰的标题栏、一个内部小部件,以及(取决于当前样式)一个窗口边框和大小抓手。
QMdiSubWindow有自己的布局,其中包括标题栏以及用于放置内部小部件的中心区域。构建QMdiSubWindow的最常见方法是调用QMdiArea::addSubWindow ()方法,并将内部小部件作为参数传递。
您也可以自行创建子窗口,并通过调用setWidget()方法来设置内部小部件。在使用子窗口进行编程时,您将使用与常规顶层窗口相同的API
(例如,您可以调用诸如 show()、hide()、showMaximized()和setWindowTitle()等函数。Subwindow Handling :
QMdisubWindow还支持MDI区域中子窗口特有的行为。
默认情况下,当在MDI区域视口中进行移动时,每个QMdiSubWindow都是可见的,
但也可以指定透明窗口的移动和缩放行为,即在这些操作期间只更新子窗口的轮廓。
使用setOption()函数来启用此行为。
isShaded()'函数检测子窗口当前是否处于阴影模式(即窗口被折叠,只显示标题栏)。
要进入阴影模式,请调用`showShaded()'。`QMdisubWindow`在窗口状态发生变化时(例如,当窗口被最小化或恢复时)会发出`windowStateChanged()、信号。
在激活之前,它还会发出`aboutToActivate()'信号。在键盘交互模式下,窗口可通过键盘进行移动和大小调整。您可以通过窗口的系统菜单进入此模式。
keyboardSingleStep`和`keyboardPageStep`属性控制每个按键事件时控件移动或调整的大小范围。
当按下 Shift 键时,使用页面步长;否则使用单步长。您还可以通过键盘来切换活动窗口。
同时按下控制键和Tab键,将激活下一个(基于当前窗口顺序)子窗口。
按下控制键、Shift键和Tab键,将激活上一个窗口。
这相当于调用`activateNextSubWindow()`和`activatePreviousSubWindow()函数。
请注意,这些快捷键会覆盖全局快捷键,但不影响QMdiAreas快捷键。*/class Q_WIDGETS_EXPORT QMdiSubWindow : public QWidget
{Q_OBJECT//设置使用键盘箭头键时,小部件应移动或调整大小的距离。//在键盘交互模式下,您可以使用箭头键和页面键移动或调整窗口大小。此属性控制箭头键。//常用的进入键盘交互方式是进入子窗口菜单,选择“调整大小”或“移动”。Q_PROPERTY(int keyboardSingleStep //默认键盘单步值为5像素。READ keyboardSingleStep WRITE setKeyboardSingleStep)//设置在使用键盘页面键时,小部件应移动或调整大小的距离。Q_PROPERTY(int keyboardPageStep //默认键盘页面步长值为20像素。READ keyboardPageStep WRITE setKeyboardPageStep)private:Q_DISABLE_COPY(QMdiSubWindow)Q_DECLARE_PRIVATE(QMdiSubWindow)Q_PRIVATE_SLOT(d_func(), void _q_updateStaysOnTopHint())Q_PRIVATE_SLOT(d_func(), void _q_enterInteractiveMode())Q_PRIVATE_SLOT(d_func(), void _q_processFocusChanged(QWidget *, QWidget *))friend class QMdiAreaPrivate;friend class QMdiAreaTabBar;friend class QMdi::ControlContainer;public://构造一个新的QMdiSubWindow小部件。parent和标志 flags参数传递给QWidget的构造函数。//除了使用addSubWindow()之外,你也可以在将子窗口添加到QMdiArea时简单地使用setParent()。//请注意,只有QMdiSubWindow可以作为QMdiArea的子窗口.QMdiSubWindow(QWidget * parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());~QMdiSubWindow();// Q_PROPERTY(int keyboardSingleStep //默认键盘单步值为5像素。
// READ keyboardSingleStep WRITE setKeyboardSingleStep)int keyboardSingleStep() const;void setKeyboardSingleStep(int step);// Q_PROPERTY(int keyboardPageStep //默认键盘页面步长值为20像素。
// READ keyboardPageStep WRITE setKeyboardPageStep)int keyboardPageStep() const;void setKeyboardPageStep(int step);QSize sizeHint() const override;QSize minimumSizeHint() const override;QWidget * maximizedButtonsWidget() const; // internal 无注释QWidget * maximizedSystemMenuIconWidget() const; // internal//如果此窗口是遮罩窗口,则返回true;否则返回false。//如果窗口被折叠,使得只有标题栏可见,则该窗口被视为遮挡。bool isShaded() const;//返回包含此子窗口的区域,如果没有则返回nullptr。QMdiArea * mdiArea () const;//返回当前系统菜单的指针,如果没有设置系统菜单则返回零。QMdiSubWindow提供了一个默认的系统菜单。//但您也可以通过setSystemMenu()来设置菜单。QMenu * systemMenu() const;void setSystemMenu(QMenu * systemMenu);//Sets systemMenu as the current system menu for this subwindow.//默认情况下,每个QMdiSubWindow都有一个标准的系统菜单。//由QMdiSubWindow创建的用于系统菜单的QActions将根据当前窗口状态自动更新;//例如,在窗口最小化后最小化操作将被禁用。用户添加的QActions不会被QMdiSubWindow更新。//QMdiSubWindow将系统菜单的控制权接管;你不需要删除它。任何现有的菜单都将被删除。//返回当前内部组件。QWidget * widget() const;void setWidget(QWidget * widget);//Sets widget as the internal widget of this subwindow.//内部小部件显示在标题栏下方的小窗口中心。//QMdiSubWindow暂时获得小部件的所有权;您无需将其删除。//任何现有的内部小部件将被移除并重新关联到根窗口。//此枚举描述了自定义QMdisubWindow行为的选项。enum SubWindowOption {AllowOutsideAreaHorizontally = 0x1, // internal //无注释AllowOutsideAreaVertically = 0x2, // internal//如果您启用了此选项,将使用橡皮筋控制来代表子窗口的轮廓,而用户进行的是该控制而非子窗口本身的调整。//因此,子窗口将保持其原始位置和大小,直到调整操作完成,届时它将接收到一个单一的OResizeEvent。RubberBandResize = 0x4, //默认情况下,此选项是禁用的。RubberBand橡皮筋RubberBandMove = 0x8 //默认情况下,此选项被禁用。//如果您启用此选项,将使用橡皮筋控制来代表子窗口的轮廓,用户将移动这个控制而不是子窗口本身。//因此,子窗口将保持在原位,直到移动操作完成,届时将向该窗口发送-个QMoveEvent。};Q_DECLARE_FLAGS(SubWindowOptions, SubWindowOption)//如果选项已启用,则返回true;否则返回false。bool testOption(SubWindowOption ) const;void setOption(SubWindowOption option, bool on = true);//If on is true, option is enabled on the subwindow; otherwise it is disabled.Q_SIGNALS://enum Qt::WindowState { WindowNoState, WindowMinimized,// WindowMaximized, WindowFullScreen, WindowActive };//QMdiSubWindow在窗口状态发生变化后发出此信号。//oldState是状态变化前的窗口状态,而newState 是当前的新状态。void windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState);void aboutToActivate();//QMdiSubWindow 在被激活之前会立即发出这个信号。//在子窗口被激活后,管理该子窗口的 QMdiArea也会发出subWindowActivated()信号。public Q_SLOTS:void showSystemMenu(); //在标题栏的系统菜单图标下方显示系统菜单。void showShaded();//调用此函数会使子窗口进入阴影模式。当子窗口处于阴影模式时,只有标题栏是可见的。//虽然并非所有样式都支持阴影,但无论是否支持阴影功能,此函数仍将显示子窗口为阴影。//然而,当与没有阴影支持的样式一起使用时,// 用户将无法通过用户界面(例如通过标题栏中的阴影按钮)从阴影模式返回。protected:bool eventFilter(QObject * object, QEvent * event) override;bool event(QEvent * event) override;void showEvent(QShowEvent * showEvent) override;void hideEvent(QHideEvent * hideEvent) override;void changeEvent(QEvent * changeEvent) override;void closeEvent(QCloseEvent * closeEvent) override;void leaveEvent(QEvent * leaveEvent) override;void resizeEvent(QResizeEvent * resizeEvent) override;void timerEvent(QTimerEvent * timerEvent) override;void moveEvent(QMoveEvent * moveEvent) override;void paintEvent(QPaintEvent * paintEvent) override;void mousePressEvent(QMouseEvent * mouseEvent) override;void mouseDoubleClickEvent(QMouseEvent * mouseEvent) override;void mouseReleaseEvent(QMouseEvent * mouseEvent) override;void mouseMoveEvent(QMouseEvent * mouseEvent) override;void keyPressEvent(QKeyEvent * keyEvent) override;void contextMenuEvent(QContextMenuEvent * contextMenuEvent) override;void focusInEvent(QFocusEvent * focusInEvent) override;void focusOutEvent(QFocusEvent * focusOutEvent) override;void childEvent(QChildEvent * childEvent) override;}; //完结 class QMdiSubWindow : public QWidgetQ_DECLARE_OPERATORS_FOR_FLAGS(QMdiSubWindow::SubWindowOptions)QT_END_NAMESPACE#endif // QMDISUBWINDOW_H
(7)
谢谢