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

文章目录

  • 详细说明
  • 公共类型
    • enum AreaOption
    • enum ViewMode
    • enum WindowOrder
  • 属性
  • 公共函数
    • 构造和析构
    • 属性相关
    • 子窗口
    • 选项
  • 重写的公共函数
  • 公共槽
  • 信号
  • 重写的受保护的函数
  • 受保护的槽
  • 演示代码

QMdiArea Class

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

Header #include < QMdiArea >
qmake QT += widgets
Inherits QAbstractScrollArea
Inherited By

主窗口(07):【类】QMdiArea [官翻]_第1张图片

详细说明

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() 。两者都是插槽,很容易连接到菜单项。

主窗口(07):【类】QMdiArea [官翻]_第2张图片 主窗口(07):【类】QMdiArea [官翻]_第3张图片
cascadeSubWindows tileSubWindows

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

公共类型

enum AreaOption

flags AreaOptions

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

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

enum ViewMode

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

Constant Value Description
QMdiArea::SubWindowView 0 显示带有窗框的子窗口(默认设置)。
QMdiArea::TabbedView 1 在选项卡栏中显示带有选项卡的子窗口。

enum WindowOrder

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

Constant Value Description
QMdiArea::CreationOrder 0 窗口按创建顺序返回。
QMdiArea::StackingOrder 1 窗口按堆叠顺序返回,最上面的窗口是列表中的最后一个窗口。
QMdiArea::ActivationHistoryOrder 2 窗口按激活顺序返回。

属性

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

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

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

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

    主窗口(07):【类】QMdiArea [官翻]_第4张图片

  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 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 
#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;
}

你可能感兴趣的:(#,Qt,Widgets)