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_NAMESPACE

class 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 QWidget

Q_DECLARE_OPERATORS_FOR_FLAGS(QMdiSubWindow::SubWindowOptions)

QT_END_NAMESPACE

#endif // QMDISUBWINDOW_H

(7)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值