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文件 ...
随机推荐
- DHorse v1.3.2 发布,基于 k8s 的发布平台
版本说明 新增特性 构建版本.部署应用时的线程池可配置化: 优化特性 构建版本跳过单元测试: 解决问题 解决Vue应用详情页面报错的问题: 解决Linux环境下脚本运行失败的问题: 解决下载Maven ...
- DesignPattern-part3
title: "modern C++ DesignPattern-Part3" date: 2018-04-12T19:08:49+08:00 lastmod: 2018-04-1 ...
- Java下载多个网络文件并打成压缩包
需求:浏览器访问后台的http地址后,后台将多个网络文件打成压缩包返回给浏览器,用户可以通过浏览器直接下载压缩包. 实现: 根据文件链接把文件下载下来并且转成字节码 ,代码: package com ...
- 《Python魔法大冒险》010 魔法宝箱:列表与元组的探险
城堡的大门 随着小鱼和魔法师的深入,他们来到了一个古老的废弃城堡.城堡的大门上挂着一个巨大的锁,而锁的旁边有一排小抽屉,每个抽屉里都有一个物品. 魔法师对小鱼说:"这是一个古老的魔法宝箱,小 ...
- 「shoi 2012」随机数
link. 对于 pass 1, 你把他考虑成 \(\frac{\sum x}{i}\) 的形式, 于是每次操作的贡献就是 \(\frac{2}{i}\), 那么答案就是 \(\sum_{i=2}^n ...
- c语言代码练习2(2)
//利用for循环,输出1-10阶乘的和#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main( ) { int i = ...
- Go 复合类型之切片类型介绍
Go 复合类型之切片类型 目录 Go 复合类型之切片类型 一.引入 二.切片(Slice)概述 2.1 基本介绍 2.2 特点 2.3 切片与数组的区别 三. 切片声明与初始化 3.1 方式一:使用切 ...
- 如何基于three.js(webgl)引擎架构,研发一套通过配置就能自动生成的3D机房系统
序: 这几年观察下来,大部分做物联网三维可视化解决方案的企业或个人, 基本都绕不开3D机房.包括前面也讲过这样的案例<使用webgl(three.js)创建自动化抽象化3D机房,3D机房模块详细 ...
- AI图形算法之一:液位计识别
AI人工智能的主要应用之一就是图形化处理和识别,之前写了两篇,分别是: AI图形算法的应用之一:通过图片模板对比发现油田漏油 AI图形算法的应用之一:仪表识别 经过几个晚上的辛苦,液位计识别也测试成功 ...
- 高效技巧揭秘:Java轻松批量插入或删除Excel行列操作
摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在职场生活中,对Excel工作表的行和列进行操作是非常普遍的需求 ...