主窗口(07):【类】QMdiArea [官翻]

QMdiArea Class

QMdiArea小部件提供了一个显示MDI窗口的区域。

Header#include < QMdiArea >
qmakeQT += widgets
InheritsQAbstractScrollArea
Inherited By

详细说明

QMdiArea的功能本质上类似于MDI窗口的窗口管理器。例如,它绘制自己管理的窗口,并以层叠或平铺模式排列它们。

QMdiArea通常用作QMainWindow中创建MDI应用程序的中心小部件,但也可以放置在任何布局中。以下代码将区域添加到主窗口:

     QMainWindow *mainWindow = new QMainWindow;
     mainWindow->setCentralWidget(mdiArea);

与顶级窗口的窗口管理器不同,QMdiArea支持所有窗口标志(Qt::WindowFlags),只要当前小部件样式支持这些标志。如果样式不支持特定标志(例如WindowShadeButtonHint),则仍可以使用showShaded() 对窗口进行着色。

QMdiArea中的子窗口是QMdiSubWindows的实例。它们通过addSubWindow() 添加到MDI区域。将QWidget(设置为内部小部件)传递给此函数是常见的,但也可以传递QMdiSubWindows 直接。那类继承QWidget,编程时可以使用与普通顶级窗口相同的API。QMdiSubWindows 还具有特定于MDI窗口的行为。有关更多详细信息,请参见QMdiSubWindows类描述。

子窗口在获得键盘焦点或调用setFocus() 时变为活动状态。用户通过以通常的方式移动焦点来激活窗口。当活动窗口更改时,MDI区域发出subWindowActivated() 信号,activeSubWindow() 函数返回活动子窗口。

便利函数subWindowList() 返回所有子窗口的列表。例如,可以在包含窗口列表的弹出菜单中使用此信息。

子窗口按当前 WindowOrder 排序。用于subWindowList() 和 activateNextSubWindow() 以及activatePreviousSubWindow() 。此外,在使用cascadeSubWindows() 和 tileSubWindows() 层叠或平铺窗口时也会使用它。

QMdiArea为子窗口提供了两种内置的布局策略:cascadeSubWindows() 和tileSubWindows() 。两者都是插槽,很容易连接到菜单项。

imgimg
cascadeSubWindowstileSubWindows

注意:QMdiArea的默认滚动条属性是Qt::ScrollBarAlwaysOff。

公共类型

enum AreaOption

flags AreaOptions

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

ConstantValueDescription
QMdiArea::DontMaximizeSubWindowOnActivation0x1当激活的子窗口最大化时,默认行为是最大化激活的下一个子窗口。如果不希望此行为,请设置此选项。

enum ViewMode

此枚举描述区域的视图模式,即如何显示子窗口。

ConstantValueDescription
QMdiArea::SubWindowView0显示带有窗框的子窗口(默认设置)。
QMdiArea::TabbedView1在选项卡栏中显示带有选项卡的子窗口。

enum WindowOrder

指定用于对subWindowList() 返回的子窗口列表排序的条件。排列窗口时,函数cascadeSubWindows() 和tileSubWindows() 遵循以下顺序。

ConstantValueDescription
QMdiArea::CreationOrder0窗口按创建顺序返回。
QMdiArea::StackingOrder1窗口按堆叠顺序返回,最上面的窗口是列表中的最后一个窗口。
QMdiArea::ActivationHistoryOrder2窗口按激活顺序返回。

属性

  1. activationOrder: WindowOrder 子窗口列表的排序条件
    此属性指定subWindowList()返回的子窗口列表的排序条件。默认情况下,它是窗口创建顺序。

    • QMdiArea::WindowOrder activationOrder() const
    • void setActivationOrder(QMdiArea::WindowOrder order)
  2. background: QBrush 工作区的背景笔刷

    此属性为工作区本身设置背景笔刷。默认情况下,它是灰色,但可以是任何笔刷(例如,颜色、渐变或像素贴图)。

    • QBrush background() const
    • void setBackground(const QBrush &background)

  3. documentMode: bool 选项卡栏在选项卡式视图模式下是否设置为文档模式

    默认情况下禁用文档模式。

    • bool documentMode() const
    • void setDocumentMode(bool enabled)
  4. tabPosition: QTabWidget::TabPosition 选项卡式视图模式中选项卡的位置
    此属性的可能值由QTabWidget::TabPosition枚举描述。

    • QTabWidget::TabPosition tabPosition() const
    • void setTabPosition(QTabWidget::TabPosition position)
  5. tabShape: QTabWidget::TabShape 选项卡式视图模式中选项卡的形状
    此属性的可能值为QTabWidget::Rounded(默认值)或QTabWidget::Triangal。

    • QTabWidget::TabShape tabShape() const
    • void setTabShape(QTabWidget::TabShape shape)
  6. tabsClosable: bool 选项卡栏是否应在选项卡式视图模式下的每个选项卡上放置关闭按钮
    默认情况下,选项卡不可关闭。

    • bool tabsClosable() const
    • void setTabsClosable(bool closable)
  7. tabsMovable: bool 是否可以在选项卡式视图模式下移动选项卡栏区域中的选项卡
    默认情况下,选项卡不可移动。

    • bool tabsMovable() const
    • void setTabsMovable(bool movable)
  8. viewMode: ViewMode 子窗口在QMdiArea中的显示方式
    默认情况下,子窗口视图用于显示子窗口。

    • QMdiArea::ViewMode viewMode() const
    • void setViewMode(QMdiArea::ViewMode mode)

公共函数

构造和析构

  • QMdiArea(QWidget *parent = nullptr)
  • virtual ~QMdiArea()

属性相关

  • QMdiArea::WindowOrder activationOrder() const
  • void setActivationOrder(QMdiArea::WindowOrder order)
  • QBrush background() const
  • void setBackground(const QBrush &background)
  • bool documentMode() const
  • void setDocumentMode(bool enabled)
  • QTabWidget::TabPosition tabPosition() const
  • void setTabPosition(QTabWidget::TabPosition position)
  • QTabWidget::TabShape tabShape() const
  • void setTabShape(QTabWidget::TabShape shape)
  • bool tabsClosable() const
  • void setTabsClosable(bool closable)
  • bool tabsMovable() const
  • void setTabsMovable(bool movable)
  • QMdiArea::ViewMode viewMode() const
  • void setViewMode(QMdiArea::ViewMode mode)

子窗口

  • QMdiSubWindow * activeSubWindow() const

  • QMdiSubWindow * addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())

    将小部件作为新的子窗口添加到MDI区域。如果windowFlags不为零,它们将覆盖小部件上设置的标志
    小部件可以是QMdiSubWindow 或其他QWidget(在这种情况下,MDI区域将创建一个子窗口并将小部件设置为内部小部件)。
    注意:添加子窗口后,其父窗口将是QMdiArea的viewport小部件。

    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小部件属性。否则,窗口将被隐藏,MDI区域将不会激活下一个子窗口。
    返回添加到MDI区域的QMdiSubWindow。

  • QMdiSubWindow * currentSubWindow() const

  • QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order = CreationOrder) const

  • void removeSubWindow(QWidget *widget)

选项

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

重写的公共函数

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

公共槽

  • void activateNextSubWindow()
  • void activatePreviousSubWindow()
  • void cascadeSubWindows() 以层叠模式排列所有子窗口
  • void tileSubWindows() 以平铺样式排列所有子窗口
  • void closeActiveSubWindow()
  • void closeAllSubWindows()
  • void setActiveSubWindow(QMdiSubWindow *window)

信号

  • 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

演示代码

#include <QtWidgets>
#define WidgetType QMdiArea

int i=0,j=0;
QList< WidgetType *> widgetList;
QList< QLabel *> labelList;

void addFrame( QWidget *parent){
   QGridLayout* mainLayout = qobject_cast<QGridLayout *>(parent->layout ()) ;

    WidgetType *widget = new WidgetType(parent);
    widgetList.append (widget);

    for (int i = 0; i < 3; ++i) {
        QMdiSubWindow *subWindow = new QMdiSubWindow(widget);
        widget->addSubWindow (subWindow);
    }

    QLabel *label = new QLabel(parent);
    labelList.append (label);

    auto *frame = new QFrame(parent);
    frame->setFrameStyle (QFrame::Panel | QFrame::Plain);

    auto *vBox = new QVBoxLayout(frame);
    vBox->addWidget (label,Qt::AlignCenter);
    vBox->addWidget (widget,Qt::AlignCenter);
    vBox->setStretch (0,0);
    vBox->setStretch (1,1);
    mainLayout->addWidget (frame,i,j);
    j++;
}

void setLabelText(int i,QString text){
    if(i >= labelList.count ()){
        return;
    }
    QLabel *label = labelList.at (i);
    label->setText (text);
}

WidgetType* getWidget(int i){
    if(i >= widgetList.count ()){
        qDebug() <<   __LINE__ <<"行 getWidget(int i) 函数 变量"<<    i  << "超出范围";
        i = 0;          // 超出范围默认使用 0
    }
    return  widgetList.at (i);
}

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);

    QMetaObject mo = WidgetType::staticMetaObject;
    app.setApplicationName (mo.className ());

    QWidget w;
    QGridLayout *mainLayout = new QGridLayout;
    w.setLayout (mainLayout);

    addFrame (&w);
    addFrame (&w);

    getWidget (0)->cascadeSubWindows ();
    getWidget (1)->tileSubWindows ();

    w.resize (600,320);
    w.show ();

    app.exec();
    return 0;
}
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QMdiArea::WindowOrder 是一个枚举型,用于表示在 QMdiArea窗口的排列顺序。这个枚举型包含了以下值: - QMdiArea::CreationOrder: 以创建顺序排列窗口 - QMdiArea::StackingOrder: 以堆叠顺序排列窗口 - QMdiArea::ActivationHistoryOrder: 以激活历史顺序排列窗口 可以使用 QMdiArea::setWindowOrder() 来设置 QMdiArea窗口的排列顺序。 ### 回答2: QMdiArea::WindowOrder是一个枚举型,用于指定QMdiAreaMDI窗口的排列顺序。它具有以下几个值: 1. QMdiArea::CreationOrder(默认值):MDI窗口按照创建的顺序排列。当新的MDI窗口被添加到QMdiArea时,它们将按照它们被添加的顺序放置在其他子窗口的上方。 2. QMdiArea::StackingOrder:MDI窗口按照堆叠的顺序排列。当新的MDI窗口被添加到QMdiArea时,它们将放置在其他子窗口的上方,使其成为当前活动的子窗口。 3. QMdiArea::ActivationHistoryOrder:MDI窗口按照活动历史的顺序排列。当一个MDI窗口被激活时,它们将被移到其他子窗口的顶部。这意味着活动的子窗口总是位于最上方,而最不活动的子窗口位于最下方。 在使用QMdiArea时,可以根据具体需求选择适当的WindowOrder。如果希望MDI窗口按照创建的顺序排列,可以使用CreationOrder。如果希望当前活动的子窗口始终位于最上方,可以使用StackingOrder。而如果希望根据活动历史来排列子窗口,可以使用ActivationHistoryOrder。 通过设置适当的WindowOrder,可以实现MDI窗口的不同排列方式,使应用程序的界面更加符合用户的预期。 ### 回答3: QMdiArea::WindowOrder是Qt中的一个枚举型,用于指定多文档界面中子窗口的排列顺序。 该枚举型有三个取值: 1. QMdiArea::CreationOrder: 子窗口按照它们被创建的顺序排列。即最新创建的子窗口将显示在最上面。 2. QMdiArea::StackingOrder: 子窗口按照它们之间的堆叠顺序排列。即最新被激活(获取焦点)的子窗口会显示在最上面,而其他子窗口则被按照激活的顺序依次堆叠在下方。 3. QMdiArea::ActivationHistoryOrder: 子窗口按照它们被激活的顺序排列。即最近被激活的子窗口会显示在最上面,而之前被激活的子窗口则按照激活的顺序依次排列在下方。 通过设置QMdiArea的windowOrder属性,可以指定子窗口的排列顺序。这在需要控制多个子窗口之间显示的顺序时非常有用。例如,如果想要按照某个特定顺序显示子窗口,可以将windowOrder设置为CreationOrder或StackingOrder;如果想要使得最近操作的子窗口一直保持在最上面,可以将windowOrder设置为ActivationHistoryOrder。 总之,QMdiArea::WindowOrder枚举型提供了多种排列子窗口的方式,通过设置QMdiArea的windowOrder属性,可以根据特定需求改变子窗口的显示顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值