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. 《Kali渗透基础》04. 主动信息收集(一)

    @ 目录 1:主动信息收集 2:发现 3:二层发现 3.1:arping 3.2:nmap 3.3:netdiscover 3.4:Scapy 4:三层发现 4.1:ping 4.2:Scapy 4. ...

  2. Dynamics 365 自定义渠道的步骤

    1.创建2个实体:渠道[new_flashinfosmschannel].消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板 标准消息模板效果: 2.导出解决方案,往XML增加一个关 ...

  3. 转载|QA|Pycharm一行代码太长如何换行?|Pycharm|工具相关

  4. tomcat远程部署

    使用maven的插件对tomcat进行远程部署,大大降低了部署步骤,对于远程部署调试也有一定的帮助 要让maven对够进行远程部署,我们需要对tomcat进行配置,主要是配置tomcat-user.x ...

  5. Python 设置环境变量方法

    Python中的os模块 Python中的os模块提供了很多与操作系统相关的功能.其中就包括设置环境变量的方法,即setenv()方法. 使用os.setenv()方法设置环境变量 import os ...

  6. 11g编译bbed

    报错如下: make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed Linking BBED utility (bbed) rm -f /u01/app/or ...

  7. 铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)

    视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性.该技术在视频补全.对象移除.视频恢复等领域有广泛应用.近年来,两种突出的 ...

  8. 轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建

    MongoDB复制集 复制集架构 在生产环境中,强烈不建议使用单机版的MongoDB服务器.原因如下: 单机版的MongoDB无法保证系统的可靠性.一旦进程发生故障或是服务器宕机,业务将直接不可用.此 ...

  9. vue之留言板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 【解决】elasticsearch:Could not parse aggregation keyed as [%s]问题

    背景 在做elasticsearch集群从原来的2.x版本升级到更新版本如6.x过程中,由于需要在原来的应用中,同时连接2.x的集群以及6.x的集群来做在线动态灰度切流量,保证流量平滑切换,有问题可随 ...