Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea`组件的常用方法及灵活运用。

QMdiArea(Multiple Document Interface Area)是Qt中用于创建多文档界面的组件。它提供了一种在单个窗口中管理多个文档的方式,每个文档通常是一个子窗口(QMdiSubWindow)。该组件主要用于设计多文档界面应用程序,具备有多种窗体展示风格,实现了在父窗体中内嵌多种子窗体的功能,使开发者能够轻松地创建支持多个文档的应用程序。

下面是一些常用的QMdiArea的方法,说明并概述成表格:

方法 说明
QMdiArea(QWidget *parent = nullptr) 构造函数,创建一个QMdiArea实例。
addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags()) 将指定的QWidget添加为QMdiArea的子窗口。
cascadeSubWindows() 将所有子窗口进行层叠排列。
tileSubWindows() 平铺排列所有子窗口。
closeAllSubWindows() 关闭所有子窗口。
setBackground(const QBrush &background) 设置QMdiArea的背景色或背景图片。
setViewMode(QMdiArea::ViewMode mode) 设置子窗口排列模式,例如QMdiArea::SubWindowViewQMdiArea::TabbedView
setTabsClosable(bool closable) 设置子窗口标签是否可关闭。
setTabsMovable(bool movable) 设置子窗口标签是否可移动。
setTabShape(QTabWidget::TabShape shape) 设置子窗口标签的形状,例如QTabWidget::RoundedQTabWidget::Triangular
setDocumentMode(bool enabled) 设置是否以文档模式显示子窗口标签。
setTabPosition(QTabWidget::TabPosition position) 设置子窗口标签的位置,例如QTabWidget::NorthQTabWidget::South
setActivationOrder(QMdiArea::ActivationOrder order) 设置子窗口的激活顺序,例如QMdiArea::StackingOrderQMdiArea::CreationOrder
setTabbedView(bool tabbed) 将QMdiArea设置为标签视图,即子窗口以标签页的形式显示。
setOption(QMdiArea::AreaOption option, bool on = true) 设置QMdiArea的选项,例如QMdiArea::DontMaximizeSubWindowOnActivation
activeSubWindow() 返回当前激活的子窗口,如果没有激活的子窗口则返回nullptr。
closeActiveSubWindow() 关闭当前激活的子窗口。

这只是一些常用方法的概述,实际上QMdiArea提供了更多的方法和选项,以满足不同应用场景的需求。开发者可以根据具体需求查阅官方文档获取更详细的信息。

读者在使用MDI组件时,需要在UI界面中增加mdiArea控件容器,之后所有窗体创建与操作都要在容器内进行,其次由于MDI窗体组件仅仅是一个画布只具备限制窗口的作用,无法实现生成窗体,所以需要在项目中手动增加自定义Dialog对话框,并对该对话框进行一定的定制,首先绘制如下案例,其顶部是一个QToolBar组件,底部则是一个QMidArea组件,如下图;

接着我们需要以此对上述菜单绑定一个唯一的名称及文本,这个过程可以通过代码实现,也可以通过图形化配置,如下图我们直接通过图形化模式增加其功能;

1.1 初始化控件

如下代码,使用QMdiArea创建多文档界面的MainWindow类的构造函数和析构函数。

下面是一些关键点的概述:

  1. QMdiArea设置为中央窗口:

    • this->setCentralWidget(ui->mdiArea);QMdiArea设置为主窗口的中央窗口,表示主要的工作区域将由QMdiArea管理。
  2. 主窗口最大化显示(注释部分):
    • this->setWindowState(Qt::WindowMaximized); 这是一行注释掉的代码,表示将主窗口设置为最大化显示。你可以根据需要取消注释,以便在启动应用程序时窗口最大化。
  3. 工具栏设置:
    • ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 设置工具栏按钮的显示风格为图标下方显示文本。这种设置在工具栏上同时显示图标和文本,提供了更直观的用户界面。
  4. 子窗口模式设置:
    • ui->mdiArea->setViewMode(QMdiArea::SubWindowView);QMdiArea的视图模式设置为子窗口模式。在子窗口模式下,QMdiArea管理并显示各个子窗口,允许用户同时查看和编辑多个文档。
  5. 析构函数:
    • 析构函数中执行了 delete ui;,确保在对象销毁时释放与ui相关的资源,避免内存泄漏。

这段代码片段展示了一个使用QMdiArea创建多文档界面的主窗口类的基本结构和初始化设置。在这个窗口中,用户可以打开和管理多个子窗口,每个子窗口可以包含一个独立的文档。

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setCentralWidget(ui->mdiArea); // 窗口最大化显示
// this->setWindowState(Qt::WindowMaximized);
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 子窗口模式
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
} MainWindow::~MainWindow()
{
delete ui;
}

程序打开后可以看到如下图所示的界面;

1.2 新建与关闭窗体

新建窗体时只需要调用new Dialog创建新的窗体,并通过addSubWindow()将新的窗体指针加入到组件内即可,当关闭时可以直接通过调用closeAllSubWindows()来实现,如下代码则是创建与关闭的实现。

// 新建窗体
void MainWindow::on_actionOpen_triggered()
{
// 创建Dialog窗体
Dialog *formDoc = new Dialog(this); // 文档窗口添加到MDI
ui->mdiArea->addSubWindow(formDoc); // 在单独的窗口中显示
formDoc->show();
} // 关闭全部
void MainWindow::on_actionClose_triggered()
{
// 关闭所有子窗口
ui->mdiArea->closeAllSubWindows();
}

运行后可以点击打开窗体创建,这个创建是无限制的,如下图;

1.3 转换窗体模式

针对模式的转换此处提供了三种模式,分别是MDI模式、级联模式及平铺模式,三种模式的实现只需要调用不同的接口即可实现,代码如下所示;

// 转为MDI模式
void MainWindow::on_actionMID_triggered(bool checked)
{
// Tab多页显示模式
if (checked)
{
// Tab多页显示模式
ui->mdiArea->setViewMode(QMdiArea::TabbedView);
// 页面可关闭
ui->mdiArea->setTabsClosable(true);
ui->actionLine->setEnabled(false);
ui->actionTile->setEnabled(false);
}
// 子窗口模式
else
{
// 子窗口模式
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
ui->actionLine->setEnabled(true);
ui->actionTile->setEnabled(true);
}
} // 恢复默认模式
void MainWindow::on_actionWindow_triggered()
{
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
ui->actionLine->setEnabled(true);
ui->actionMID->setEnabled(true);
ui->actionTile->setEnabled(true);
} // 级联模式
void MainWindow::on_actionLine_triggered()
{
ui->mdiArea->cascadeSubWindows();
} // 平铺模式
void MainWindow::on_actionTile_triggered()
{
ui->mdiArea->tileSubWindows();
}

子窗口模式(QMdiArea::SubWindowView)

  • 这是多文档界面的默认模式,允许用户在主窗口内同时打开多个子窗口,每个子窗口可以包含一个独立的文档或视图。
  • 子窗口可以重叠、平铺、级联等方式排列。

标签页多页显示模式(QMdiArea::TabbedView)

  • 在这种模式下,子窗口以标签页的形式显示在主窗口的顶部,用户可以通过点击标签页来切换不同的子窗口。
  • 提供了标签页的关闭按钮,允许用户关闭特定的标签页。

级联模式和平铺模式

  • 这两种模式是在标签页多页显示模式下的两种特定排列方式。
  • 级联模式(Cascade): 子窗口以重叠的方式显示,类似级联排列的效果,方便用户查看和操作每个子窗口。

  • 平铺模式(Tile): 子窗口以平铺的方式显示,使它们在主窗口中均匀分布,方便用户同时浏览多个子窗口内容。

这些模式提供了不同的用户体验,使用户能够根据实际需求选择最适合他们工作流程的窗口排列方式。用户可以根据应用程序的性质和自己的使用偏好在这些模式之间切换。

完整案例下载

C++ Qt开发:MdiArea多窗体组件的更多相关文章

  1. C/C++ Qt MdiArea 多窗体组件应用

    MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操 ...

  2. Qt开发:Windows 下进程间通信的可行桥梁:窗体消息SendMessage

    Qt开发:Windows 下进程间通信的可行桥梁:窗体消息 注:窗体消息仅适用于有窗口的进程,如果没有窗口是无法收到窗体消息的(哪怕是隐形的都可以),比如Qt中如果需要使用WindowsMessage ...

  3. 基于arm的嵌入式QT开发(课程设计)

    一. 项目要求 配置QT5.7基于x86及arm 等两种CPU架构的调试及开发环境: 移植arm编译后的QT5.7及屏幕校准工具tslib1.4至CORTEX ARM9实验平台: 开发基于QT5.7的 ...

  4. Qt开发环境的建立

    在建立开发环境之前,先来了解一下Qt是什么以及它的历史变迁.Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序, ...

  5. win使用MSYS2安装Qt开发环境

    原文链接 MSYS2 下载地址: pacman的具体用法 有pacman的具体使用方法.我们首先对系统升级 我们首先对系统升级 pacman -Syu 就会检测整个系统可以升级的组件,并自动下载安装, ...

  6. 基于QT开发的第三方库

    基于Qt开发的第三方库 分类: Qt2014-02-12 11:34 1738人阅读 评论(0) 收藏 举报 QT第三方库   目录(?)[+]   文章来源:http://blog.csdn.net ...

  7. 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集

    简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...

  8. Qt开发环境下载和安装

    Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project.org ...

  9. Qt开发北斗定位系统融合百度地图API及Qt程序打包发布

    Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1.上位机介绍 最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加 ...

  10. CAD控件:QT开发使用控件入门

    1. 环境搭建: 3 1.1. 安装Qt 3 1.2. 安装Microsoft Windows SDK的调试包 6 2. QT中使用MxDraw控件 7 1.3. 引入控件 7 3. 打开DWG文件 ...

随机推荐

  1. 深入理解Linux内核——内存管理(2)

    提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...

  2. mall :hutool项目源码解析

    目录 一.mall开源项目 1.1 来源 1.2 项目转移 1.3 项目克隆 二.Hutool工具类库 2.1 Hutool 简介 三.源码解析 3.1 集成与配置 3.1.1 导入依赖 3.1.2 ...

  3. gitlab与LDAP 联调

    gitlab整理 目录 gitlab整理 1.安装Gitlab依赖包 2.下载,安装 3.配置,访问域名及邮箱 4.初始化,启动 5.访问,以及邮箱测试 5.1汉化 6.问题总结处理 6.1安装时出现 ...

  4. python一键过杀软

    python过杀软新 利用python加载shellcode过360.火绒等杀软 先上代码 将以下代码保存到 mt.py import base64 import os import shutil b ...

  5. 「loj - 3022」「cqoi 2017」老 C 的方块

    link. good题,考虑像 国家集训队 - happiness 一样在棋盘上搞染色,我毛张 @shadowice1987 的图给你看啊 你像这样奇数层以 red -> blue -> ...

  6. 宏观上理解blazor中的表单验证

    概述 表单验证的最终效果大家都懂,这里不阐述了,主要从宏观角度说说blazor中表单验证框架涉及到的类,以及它们是如何协作的,看完这个,再看官方文档也许能更轻松点. blazor中的验证框架分为两部分 ...

  7. Codechef - Longest AND Subarray(位运算)

    题目大意   给定一个正整数N,其序列为[1, 2, 3, ..., N],找到一个长度最大的连续子列,使得其所有元素取与运算的结果为正(最终输出只需要输出最大长度即可). 思路   刚开始可能并不好 ...

  8. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-19-处理鼠标拖拽-中篇

    1.简介 上一篇中,主要是介绍了拖拽的各种方法的理论知识以及实践,今天宏哥讲解和分享一下划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.划取字段操作 划取字段操 ...

  9. QUERIES

    这个题解..u1s1我没看懂,但是我觉得这里面有一个重要的思想就是对于像异或这种最终值只是看一个数位的问题,我们可以考虑分解,把每一个子问题单独解决就可以了其实更难的应该是每个子区间的异或和之和这个方 ...

  10. 一个vuepress配置问题,引发的js递归算法思考

    前言 这两天在尝试用语雀+ vuepress + github 搭建个人博客. 小破站地址 :王天的 web 进阶之路 语雀作为编辑器,发布文档推送 github,再自动打包部署,大概流程如下. 问题 ...