C++ Qt开发:MdiArea多窗体组件
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::SubWindowView或QMdiArea::TabbedView。 |
setTabsClosable(bool closable) |
设置子窗口标签是否可关闭。 |
setTabsMovable(bool movable) |
设置子窗口标签是否可移动。 |
setTabShape(QTabWidget::TabShape shape) |
设置子窗口标签的形状,例如QTabWidget::Rounded或QTabWidget::Triangular。 |
setDocumentMode(bool enabled) |
设置是否以文档模式显示子窗口标签。 |
setTabPosition(QTabWidget::TabPosition position) |
设置子窗口标签的位置,例如QTabWidget::North或QTabWidget::South。 |
setActivationOrder(QMdiArea::ActivationOrder order) |
设置子窗口的激活顺序,例如QMdiArea::StackingOrder或QMdiArea::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类的构造函数和析构函数。
下面是一些关键点的概述:
QMdiArea设置为中央窗口:this->setCentralWidget(ui->mdiArea);将QMdiArea设置为主窗口的中央窗口,表示主要的工作区域将由QMdiArea管理。
- 主窗口最大化显示(注释部分):
this->setWindowState(Qt::WindowMaximized);这是一行注释掉的代码,表示将主窗口设置为最大化显示。你可以根据需要取消注释,以便在启动应用程序时窗口最大化。
- 工具栏设置:
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);设置工具栏按钮的显示风格为图标下方显示文本。这种设置在工具栏上同时显示图标和文本,提供了更直观的用户界面。
- 子窗口模式设置:
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);将QMdiArea的视图模式设置为子窗口模式。在子窗口模式下,QMdiArea管理并显示各个子窗口,允许用户同时查看和编辑多个文档。
- 析构函数:
- 析构函数中执行了
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多窗体组件的更多相关文章
- C/C++ Qt MdiArea 多窗体组件应用
MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操 ...
- Qt开发:Windows 下进程间通信的可行桥梁:窗体消息SendMessage
Qt开发:Windows 下进程间通信的可行桥梁:窗体消息 注:窗体消息仅适用于有窗口的进程,如果没有窗口是无法收到窗体消息的(哪怕是隐形的都可以),比如Qt中如果需要使用WindowsMessage ...
- 基于arm的嵌入式QT开发(课程设计)
一. 项目要求 配置QT5.7基于x86及arm 等两种CPU架构的调试及开发环境: 移植arm编译后的QT5.7及屏幕校准工具tslib1.4至CORTEX ARM9实验平台: 开发基于QT5.7的 ...
- Qt开发环境的建立
在建立开发环境之前,先来了解一下Qt是什么以及它的历史变迁.Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序, ...
- win使用MSYS2安装Qt开发环境
原文链接 MSYS2 下载地址: pacman的具体用法 有pacman的具体使用方法.我们首先对系统升级 我们首先对系统升级 pacman -Syu 就会检测整个系统可以升级的组件,并自动下载安装, ...
- 基于QT开发的第三方库
基于Qt开发的第三方库 分类: Qt2014-02-12 11:34 1738人阅读 评论(0) 收藏 举报 QT第三方库 目录(?)[+] 文章来源:http://blog.csdn.net ...
- 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...
- Qt开发环境下载和安装
Qt是跨平台的图形开发库,目前由Digia全资子公司 Qt Company 独立运营,官方网址: http://www.qt.io/ 也可以访问Qt项目域名:http://qt-project.org ...
- Qt开发北斗定位系统融合百度地图API及Qt程序打包发布
Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1.上位机介绍 最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加 ...
- CAD控件:QT开发使用控件入门
1. 环境搭建: 3 1.1. 安装Qt 3 1.2. 安装Microsoft Windows SDK的调试包 6 2. QT中使用MxDraw控件 7 1.3. 引入控件 7 3. 打开DWG文件 ...
随机推荐
- JSTL fn函数使用总结
首先,我们要在页面的最上方引用: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function ...
- C# winform 无边框窗口 移动
给自己留个笔记, 在用wke做界面的时候. 往往需要把winform窗口设置成无边框 但是WebUI也需要移动窗口, 所以才把以前在易语言中用的方法翻译过来使用 第零步: 设置无边框窗口 form属性 ...
- DAY005_异或运算
运算规则 二进制:相同为0 相异为1 十进制:相同为0 任何数字和0异或都是它本身 不利用额外变量交换两个数 数组中一种数字出现了奇数次,其他数都出现了偶数次,怎么得到这个出现了奇数次的数 将所有的数 ...
- Llama2-Chinese项目:3.1-全量参数微调
提供LoRA微调和全量参数微调代码,训练数据为data/train_sft.csv,验证数据为data/dev_sft.csv,数据格式如下所示: "<s>Human: &q ...
- 其它——Siege压力测试工具使用
文章目录 Siege压力测试工具使用 一 Siege介绍 二 windows 下使用 三 mac和linux使用 四 使用 五 参数详解 六 结果详解 七 修改系统的文件描述符限制 Siege压力测试 ...
- MySQL系列之——SQL介绍、常用SQL分类、数据类型、表属性、字符集、DDL应用、DCL应用、DML应用(增删改)、DQL应用(select )、元数据信息、show命令
文章目录 一 SQL介绍 二 常用SQL分类 2.1 客户端命令 三 数据类型.表属性.字符集 3.1 数据类型 3.1.1 作用 3.1.2 种类 3.2 表属性 3.2.1 列属性 3.2.2 表 ...
- ORA-10456: cannot open standby database; media recovery session may be in progress
SQL> alter database recover managed standby database disconnect from session;Database altered.SQL ...
- 一个简单的C4.5算法,采用Python语言
Test1.py 主要是用来运行的 代码如下: # -*- coding: utf-8 -*- from math import log import operator import treePlot ...
- 一些对dp突然的理解
突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来就是对于状态的设计 用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的也就是我们的状态设计要 ...
- 使用gitbook快速搭建文档中心
背景 在研发一个系统,主要给公司内部同事用,按理说,简单点的话,搞个使用文档就行了,但产品经理希望是做成一个文档中心,比如,你学习个新技术的时候,比如vue,一般有个在线的帮助文档,他的想法就是这种. ...