QMdiArea Class

The QMdiArea widget provides an area in which MDI windows are displayed. More...

Header: #include <QMdiArea>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets

Public Types

enum AreaOption { DontMaximizeSubWindowOnActivation }
flags AreaOptions
enum ViewMode { SubWindowView, TabbedView }
enum WindowOrder { CreationOrder, StackingOrder, ActivationHistoryOrder }

Properties

Public Functions

QMdiArea(QWidget *parent = nullptr)
~QMdiArea()
QMdiArea::WindowOrder activationOrder() const
QMdiSubWindow *activeSubWindow() const
QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags = Qt::WindowFlags())
QBrush background() const
QMdiSubWindow *currentSubWindow() const
QSize minimumSizeHint() const
void removeSubWindow(QWidget *widget)
void setActivationOrder(QMdiArea::WindowOrder order)
void setBackground(const QBrush &background)
void setOption(QMdiArea::AreaOption option, bool on = true)
void setViewMode(QMdiArea::ViewMode mode)
QSize sizeHint() const
QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order = CreationOrder) const
bool testOption(QMdiArea::AreaOption option) const
QMdiArea::ViewMode viewMode() const

Public Slots

Protected Functions

void childEvent(QChildEvent *childEvent)
bool event(QEvent *event)
bool eventFilter(QObject *object, QEvent *event)
void paintEvent(QPaintEvent *paintEvent)
void resizeEvent(QResizeEvent *resizeEvent)
void scrollContentsBy(int dx, int dy)
void showEvent(QShowEvent *showEvent)
void timerEvent(QTimerEvent *timerEvent)
bool viewportEvent(QEvent *event)

Protected Slots

void setupViewport(QWidget *viewport)

Detailed Description

QMdiArea functions, essentially, like a window manager for MDI windows. For instance, it draws the windows it manages on itself and arranges them in a cascading or tile pattern. QMdiArea is commonly used as the center widget in a QMainWindow to create MDI applications, but can also be placed in any layout. The following code adds an area to a main window:

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

Unlike the window managers for top-level windows, all window flags (Qt::WindowFlags) are supported by QMdiArea as long as the flags are supported by the current widget style.

Subwindows in QMdiArea are instances of QMdiSubWindow. They are added to an MDI area with addSubWindow(). It is common to pass a QWidget, which is set as the internal widget, to this function, but it is also possible to pass a QMdiSubWindow directly. The class inherits QWidget, and you can use the same API as with a normal top-level window when programming. QMdiSubWindow also has behavior that is specific to MDI windows. See the QMdiSubWindow class description for more details.

A subwindow becomes active when it gets the keyboard focus, or when setFocus() is called. The user activates a window by moving focus in the usual ways. The MDI area emits the subWindowActivated() signal when the active window changes, and the activeSubWindow() function returns the active subwindow.

The convenience function subWindowList() returns a list of all subwindows. This information could be used in a popup menu containing a list of windows, for example.

The subwindows are sorted by the current WindowOrder. This is used for the subWindowList() and for activateNextSubWindow() and activatePreviousSubWindow(). Also, it is used when cascading or tiling the windows with cascadeSubWindows() and tileSubWindows().

QMdiArea provides two built-in layout strategies for subwindows: cascadeSubWindows() and tileSubWindows(). Both are slots and are easily connected to menu entries.

Note: The default scroll bar property for QMdiArea is Qt::ScrollBarAlwaysOff.

See also QMdiSubWindow.

Member Type Documentation

enum QMdiArea::AreaOption
flags QMdiArea::AreaOptions

This enum describes options that customize the behavior of the QMdiArea.

ConstantValueDescription
QMdiArea::DontMaximizeSubWindowOnActivation0x1When the active subwindow is maximized, the default behavior is to maximize the next subwindow that is activated. Set this option if you do not want this behavior.

The AreaOptions type is a typedef for QFlags<AreaOption>. It stores an OR combination of AreaOption values.

enum QMdiArea::ViewMode

This enum describes the view mode of the area; i.e. how sub-windows will be displayed.

ConstantValueDescription
QMdiArea::SubWindowView0Display sub-windows with window frames (default).
QMdiArea::TabbedView1Display sub-windows with tabs in a tab bar.

See also setViewMode().

enum QMdiArea::WindowOrder

Specifies the criteria to use for ordering the list of child windows returned by subWindowList(). The functions cascadeSubWindows() and tileSubWindows() follow this order when arranging the windows.

ConstantValueDescription
QMdiArea::CreationOrder0The windows are returned in the order of their creation.
QMdiArea::StackingOrder1The windows are returned in the order in which they are stacked, with the top-most window being last in the list.
QMdiArea::ActivationHistoryOrder2The windows are returned in the order in which they were activated.

See also subWindowList().

Property Documentation

activationOrder : WindowOrder

This property holds the ordering criteria for subwindow lists

This property specifies the ordering criteria for the list of subwindows returned by subWindowList(). By default, it is the window creation order.

Access functions:

QMdiArea::WindowOrder activationOrder() const
void setActivationOrder(QMdiArea::WindowOrder order)

See also subWindowList().

background : QBrush

This property holds the background brush for the workspace

This property sets the background brush for the workspace area itself. By default, it is a gray color, but can be any brush (e.g., colors, gradients or pixmaps).

Access functions:

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

viewMode : ViewMode

This property holds the way sub-windows are displayed in the QMdiArea.

By default, the SubWindowView is used to display sub-windows.

Access functions:

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

See also ViewMode, setTabShape(), and setTabPosition().

Member Function Documentation

QMdiArea::QMdiArea(QWidget *parent = nullptr)

Constructs an empty mdi area. parent is passed to QWidget's constructor.

[noexcept] QMdiArea::~QMdiArea()

Destroys the MDI area.

[slot] void QMdiArea::activateNextSubWindow()

Gives the keyboard focus to another window in the list of child windows. The window activated will be the next one determined by the current activation order.

See also activatePreviousSubWindow() and QMdiArea::WindowOrder.

[slot] void QMdiArea::activatePreviousSubWindow()

Gives the keyboard focus to another window in the list of child windows. The window activated will be the previous one determined by the current activation order.

See also activateNextSubWindow() and QMdiArea::WindowOrder.

QMdiSubWindow *QMdiArea::activeSubWindow() const

Returns a pointer to the current active subwindow. If no window is currently active, nullptr is returned.

Subwindows are treated as top-level windows with respect to window state, i.e., if a widget outside the MDI area is the active window, no subwindow will be active. Note that if a widget in the window in which the MDI area lives gains focus, the window will be activated.

See also setActiveSubWindow() and Qt::WindowState.

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

Adds widget as a new subwindow to the MDI area. If windowFlags are non-zero, they will override the flags set on the widget.

The widget can be either a QMdiSubWindow or another QWidget (in which case the MDI area will create a subwindow and set the widget as the internal widget).

Note: Once the subwindow has been added, its parent will be the viewport widget of the QMdiArea.

     QMdiArea mdiArea;
     QMdiSubWindow *subWindow1 = new QMdiSubWindow;
     subWindow1->setWidget(internalWidget1);
     subWindow1->setAttribute(Qt::WA_DeleteOnClose);
     mdiArea.addSubWindow(subWindow1);

     QMdiSubWindow *subWindow2 =
         mdiArea.addSubWindow(internalWidget2);

When you create your own subwindow, you must set the Qt::WA_DeleteOnClose widget attribute if you want the window to be deleted when closed in the MDI area. If not, the window will be hidden and the MDI area will not activate the next subwindow.

Returns the QMdiSubWindow that is added to the MDI area.

See also removeSubWindow().

[slot] void QMdiArea::cascadeSubWindows()

Arranges all the child windows in a cascade pattern.

See also tileSubWindows().

[protected] void QMdiArea::childEvent(QChildEvent *childEvent)

[slot] void QMdiArea::closeActiveSubWindow()

Closes the active subwindow.

See also closeAllSubWindows().

[slot] void QMdiArea::closeAllSubWindows()

Closes all subwindows by sending a QCloseEvent to each window. You may receive subWindowActivated() signals from subwindows before they are closed (if the MDI area activates the subwindow when another is closing).

Subwindows that ignore the close event will remain open.

See also closeActiveSubWindow().

QMdiSubWindow *QMdiArea::currentSubWindow() const

Returns a pointer to the current subwindow, or nullptr if there is no current subwindow.

This function will return the same as activeSubWindow() if the QApplication containing QMdiArea is active.

See also activeSubWindow() and QApplication::activeWindow().

[protected] bool QMdiArea::event(QEvent *event)

[protected] bool QMdiArea::eventFilter(QObject *object, QEvent *event)

QSize QMdiArea::minimumSizeHint() const

[protected] void QMdiArea::paintEvent(QPaintEvent *paintEvent)

void QMdiArea::removeSubWindow(QWidget *widget)

Removes widget from the MDI area. The widget must be either a QMdiSubWindow or a widget that is the internal widget of a subwindow. Note widget is never actually deleted by QMdiArea. If a QMdiSubWindow is passed in, its parent is set to nullptr and it is removed; but if an internal widget is passed in, the child widget is set to nullptr and the QMdiSubWindow is not removed.

See also addSubWindow().

[protected] void QMdiArea::resizeEvent(QResizeEvent *resizeEvent)

[protected] void QMdiArea::scrollContentsBy(int dx, int dy)

[slot] void QMdiArea::setActiveSubWindow(QMdiSubWindow *window)

Activates the subwindow window. If window is nullptr, any current active window is deactivated.

See also activeSubWindow().

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

If on is true, option is enabled on the MDI area; otherwise it is disabled. See AreaOption for the effect of each option.

See also AreaOption and testOption().

[protected slot] void QMdiArea::setupViewport(QWidget *viewport)

This slot is called by QAbstractScrollArea after setViewport() has been called. Reimplement this function in a subclass of QMdiArea to initialize the new viewport before it is used.

See also setViewport().

[protected] void QMdiArea::showEvent(QShowEvent *showEvent)

QSize QMdiArea::sizeHint() const

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

Returns a list of all subwindows in the MDI area. If order is CreationOrder (the default), the windows are sorted in the order in which they were inserted into the workspace. If order is StackingOrder, the windows are listed in their stacking order, with the topmost window as the last item in the list. If order is ActivationHistoryOrder, the windows are listed according to their recent activation history.

See also WindowOrder.

bool QMdiArea::testOption(QMdiArea::AreaOption option) const

Returns true if option is enabled; otherwise returns false.

See also AreaOption and setOption().

[slot] void QMdiArea::tileSubWindows()

Arranges all child windows in a tile pattern.

See also cascadeSubWindows().

[protected] void QMdiArea::timerEvent(QTimerEvent *timerEvent)

[protected] bool QMdiArea::viewportEvent(QEvent *event)