主窗口(08):【类】QMdiSubWindow [官翻]

QMdiSubWindow Class

QMdiSubWindow 类为QMdiArea提供了一个子窗口类。

Header#include < QMdiSubWindow >
qmakeQT += widgets
InheritsQWidget
Inherited By

详细说明

QMdiSubWindow表示QMdiArea中的顶级窗口,它由带有窗口装饰的标题栏、内部小部件以及(取决于当前样式)窗口框架和大小夹点组成。QMdiSubWindow 有自己的布局,它由标题栏和内部小部件的中心区域组成。

img

构造QMdiSubWindow最常用的方法是使用内部小部件作为参数调用QMdiArea::addSubWindow() 。您还可以自己创建一个子窗口,并通过调用setWidget() 来设置内部小部件。

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

子窗口处理

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

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

函数isShaded() 的作用是:检测子窗口当前是否有阴影(也就是说,窗口被折叠,只有标题栏可见)。要进入着色模式,请调用showShaded() 。每当窗口状态发生更改时(例如,当窗口最小化或恢复时),QMdiSubWindow就会发出windowStateChanged() 信号。它在被激活之前也会发出aboutToActivate() 。

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

也可以用键盘更改活动窗口。同时按下control和tab键,将激活下一个(使用当前WindowOrder)子窗口。通过按control、shift和tab,您将激活上一个窗口。这相当于调用activateNextSubWindow() 和activatePreviousSubWindow() 。请注意,这些快捷方式覆盖全局快捷方式,但不覆盖QMdiAreas快捷方式。

公共类型

enum SubWindowOption

flags SubWindowOptions

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

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

属性

  1. keyboardPageStep: int 使用键盘页键时小部件应移动或调整大小的距离

    在键盘交互模式下,可以使用箭头键和页键移动或调整窗口大小。此属性控制页键。进入键盘交互模式的常用方法是进入子窗口菜单,然后选择“resize”或“move”。
    默认的键盘页步长值为20像素。

    • int keyboardPageStep() const
    • void setKeyboardPageStep(int step)
  2. keyboardSingleStep: int 使用键盘箭头键时小部件应移动或调整大小的距离

    在键盘交互模式下,可以使用箭头键和页键移动或调整窗口大小。此属性控制箭头键。进入键盘交互模式的常用方法是进入子窗口菜单,然后选择“resize”或“move”。
    默认的键盘单步值为5像素。

    • int keyboardSingleStep() const
    • void setKeyboardSingleStep(int step)

公共函数

构造和析构

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

    构造一个新的QMdiSubWindow小部件。parent和flags参数被传递给QWidget的构造函数。

    当您将子窗口添加到QMdiArea时,也可以使用setParent(),而不是使用addSubWindow()。

    注意,只有QMdiSubWindows可以设置为QMdiArea的子节点;例如,你不能这样写:

     //bad code
     QMdiArea mdiArea;
     QTextEdit editor(&mdiArea); // invalid child widget
    
  • virtual ~QMdiSubWindow()

属性相关

  • int keyboardPageStep() const
  • void setKeyboardPageStep(int step)
  • int keyboardSingleStep() const
  • void setKeyboardSingleStep(int step)

其它

  • bool isShaded() const

  • QMdiArea * mdiArea() const

  • QMenu * systemMenu() const
    void setSystemMenu(QMenu *systemMenu) 设置systemMenu为该子窗口的当前系统菜单

    默认情况下,每个QMdiSubWindow都有一个标准的系统菜单。
    QMdiSubWindow创建的系统菜单的QActions将根据当前窗口状态自动更新;例如,窗口被最小化后,最小化操作将被禁用。
    QMdiSubWindow不会更新用户添加的QAction。
    QMdiSubWindow获得systemMenu的所有权;你不需要删除它。所有现有的菜单将被删除。

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

  • QWidget * widget() const
    void setWidget(QWidget *widget) 将小部件设置为子窗口的内部小部件

    内部小部件显示在标题栏下面的子窗口的中央。QMdiSubWindow获得widget的临时所有权;你不需要删除它。任何现有的内部小部件都将被删除,并重新指向根窗口。

重写的公共函数

  • 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
Qt多文档窗口应用中,有时会出现这样一个应用场景:在这个全局应用中,只new了一次,其后操作就是隐藏和现实。 即:通过界面的工具栏或菜单,触发显示一个子窗口,当这个窗口存在时候,显示在最前面,点击窗口关闭的时候,只是隐藏这个窗口,而不是销毁。 父窗口要代码如下: pW1 = new myWidget(ui.mdiArea) ; //new一个子部件 QMdiSubWindow pMdiSubwin1 = ui.mdiArea->addSubWindow(pW1) ;//将子部件 装入QMdiSubWindow,同时获取该QMdiSubWindow指针 pMdiSubwin1->hide(); //设置子窗口隐藏 pW1->installEventFilter(this); //在父窗口中注册子部件消息过滤事件 在子部件发生QCloseEvent事件时候,直接忽略该事件: void myWidget::closeEvent(QCloseEvent *e) { e->ignore(); } 尽管在子窗口中忽略了该窗口的关闭动作,实际并未关闭,但是该消息通过注册在父窗口的消息过滤器传到父窗口中,在父窗口中的过滤事件处理时,通过QMdiSubWindow隐藏操作,实现隐藏子窗口: if( (target == pW1 ) && (event->type() == QEvent::Close) ) pMdiSubwin1->hide() ; 小结: 本例程在VS2010+QT。8.5下实现,方法及思路 在该应用中只能通过获取子窗口的指针进行隐藏/小时操作,而不是使用被装入子窗口的部件窗口指针进行操作。 另:直接通过子部件隐藏操作,会出现子部件中的部件消失,只剩下僵尸窗口的现象,不能实现隐藏子窗口。 例程源码链接:https://download.csdn.net/download/weixin_46079613/12517109
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值