C/C++ Qt MdiArea 多窗体组件应用
xsobi 2025-01-01 23:16 25 浏览
MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。
MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制。
这个Dialog对话框我们只增加两个功能,一个Dialog::currentFileName()获取窗体标题,另一个Dialog::SetData(QString data)设置数据到编辑框,代码实现如下.
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
this->setWindowTitle("New Doc <By: LyShark >"); // 窗口标题
this->setAttribute(Qt::WA_DeleteOnClose); // 关闭时自动删除
this->setFixedSize(200,100); // 设置窗体大小
// this->setWindowIcon(QIcon(":/image/1.ico"));
}
Dialog::~Dialog()
{
delete ui;
}
// 获取窗体标题
// By: LyShark
QString Dialog::currentFileName()
{
QString title = this->windowTitle();
return title;
}
// 设置编辑框内容
// https://www.cnblogs.com/lyshark
void Dialog::SetData(QString data)
{
ui->lineEdit->setText(data);
}
接着我们开始绘制这个程序的主界面,在toolBar中增加相应的菜单栏,并在主窗体中放入mdiArea容器组件。
窗体中的顶部菜单栏,我们需要手动定义一下他们所具备的功能名称等。
当程序启动后,程序调用MainWindow初始化这个窗体,初始化代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <iostream>
#include <QCloseEvent>
// 如果直接关闭,则清空所有对话框
// https://www.cnblogs.com/lyshark
void MainWindow::closeEvent(QCloseEvent *event)
{
ui->mdiArea->closeAllSubWindows();
event->accept();
}
// By: LyShark
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;
}
代码运行效果如下:
用户新建窗体执行MainWindow::on_actionOpen_triggered()事件,关闭窗体时则执行MainWindow::on_actionClose_triggered()事件。
// 新建窗体
void MainWindow::on_actionOpen_triggered()
{
Dialog *formDoc = new Dialog(this); //
ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
formDoc->show(); //在单独的窗口中显示
}
// 关闭全部
void MainWindow::on_actionClose_triggered()
{
ui->mdiArea->closeAllSubWindows(); //关闭所有子窗口
}
代码运行效果如下:
当用户点击MDI模式时,我们则执行以下代码,将所有已存在的窗体合并为一个类似于TabWidget的窗体组件。
// 转为MID模式
void MainWindow::on_actionMID_triggered(bool checked)
{
// Tab多页显示模式
if (checked)
{
ui->mdiArea->setViewMode(QMdiArea::TabbedView); // Tab多页显示模式
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);
}
}
代码运行效果如下:
窗体级联模式则是将窗体并排排列在一起,我们只需要调用ui->mdiArea->cascadeSubWindows();方法即可实现.
// 级联模式
void MainWindow::on_actionLine_triggered()
{
ui->mdiArea->cascadeSubWindows();
}
代码运行效果如下:
平铺模式同样使用ui->mdiArea->tileSubWindows();即可实现转换。
// 平铺模式
void MainWindow::on_actionTile_triggered()
{
ui->mdiArea->tileSubWindows();
}
代码运行效果如下:
最后一个功能是主窗体发送数据到子窗体,该功能的实现需要两个函数。
- on_mdiArea_subWindowActivated 实现设置主窗体名字到自身
- on_actionSendMsg_triggered 实现主窗体发送消息到子窗体内
// 当子窗体打开时获取到其窗体标题
// By: LyShark
void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
Q_UNUSED(arg1);
// 若子窗口个数为零,则将statusBar置空
if (ui->mdiArea->subWindowList().count()==0)
{
ui->statusBar->clearMessage();
}
else
{
// 如果不为0则显示主窗口的文件名
Dialog *formDoc=static_cast<Dialog*>(ui->mdiArea->activeSubWindow()->widget());
ui->statusBar->showMessage(formDoc->currentFileName());
}
}
// 对选中窗体发送数据
// https://www.cnblogs.com/lyshark
void MainWindow::on_actionSendMsg_triggered()
{
// 先获取当前MDI子窗口
Dialog *formDoc;
// 如果打开则获取活动窗体
if (ui->mdiArea->subWindowList().count() > 0)
{
formDoc=(Dialog*)ui->mdiArea->activeSubWindow()->widget();
// 对活动窗体设置数据
formDoc->SetData("hello lyshark");
}
}
代码运行效果如下:
相关推荐
- 常见的15个shell脚本案例,请收藏
-
1.**HelloWorld**-最简单的脚本示例:#!/bin/bashecho"Hello,World!"2.**计算目录下文件数目**-统计当前目录下文件...
- 如何在Linux下的进行多进程编程(初步)
-
Linux下的多进程编程初步1引言对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年...
- Linux系统Shell脚本编程之whiptail图形化工具设置网卡IP地址
-
摘要:在Linux环境里开发软件的时候,有时候得输入一长串的交互命令,才能拿到想要的数据或者得出想要的结果。可每次都得重新输入这些指令,实在是太机械、太麻烦啦!要是能有一种特别直观的交互式界面工具...
- 吃货必备:与“吃”有关的俚语
-
人们在日常生活和每日聊天的对话中总会用到俚语,能掌握一些地道的俚语表达,并将这些表达应用到口语中,定会为你的回答增色不少。下面给大家整理出了一些与“吃”有关的地道俚语,快来看看你了解多少?1.Top...
- ROS2 Jazzy:启动多个节点
-
目标使用命令行工具一次性启动多个节点。背景知识在大多数入门教程里,每当运行一个新节点时,你都需要打开新的终端。当你构建更复杂的系统,同时运行越来越多的节点时,不断打开终端并重新输入配置细节会变得十分繁...
- shell中如何确定脚本的位置?这篇文章告诉你
-
我想从同一个位置读取一些配置文件,如何确定脚本的位置?。这个问题的出现主要是由两个原因引发的:一是您希望将脚本的数据或配置进行外部化,因此需要一种方式来寻找这些外部资源;二是您的脚本需要对某些捆绑资源...
- linux shell 脚本 入门到实战详解
-
—、shell入门简介1.1什么是shellshell脚本简介#为啥介绍shell上次出了一篇linux命令详解,得到了很多小伙伴的认可,有部分粉丝私信我,让我出一份shell编程。进过...
- 一文搞懂shell脚本
-
一文搞懂shell脚本1、shell脚本介绍什么是shell脚本一系列的shell命令的集合,还可以加入一些逻辑操作(ifelsefor)将这些命令放入一个文件中.什么是shell命令?ls...
- 风小逍陪你一起学习SHELL编程 - 重用和模块化
-
Shell编程中的函数编程指的是在Shell脚本中创建和使用函数以实现代码模块化和可重用性。Shell脚本是一种用于自动化任务和编写脚本的脚本语言,它在Unix和类Unix系统上广泛使...
- Shell编程:编写sum函数,计算所有参数之和
-
Shell编程:编写sum函数,计算所有参数之和今天有网友求助,说是正在考试,有一道题不会做。题目不是很难:编写sum函数,计算所有参数之和。这道题的编码思路很简单,只涉及数学运算和shell参数。花...
- shell常用命令之awk用法介绍
-
一、awk介绍awk的强大之处,在于能生成强大的格式化报告。数据可以来自标准输入,一个或多个文件,或者其他命令的输出。他支持用户自定义函数和动态正则表达式等先进功能,是Linux/unix一个强大的文...
- Shell脚本编程:系统性能监控实战示例
-
Shell脚本编程:系统性能监控实战示例一、开篇:轻量级监控的艺术在服务器运维中,系统监控如同脉搏检测,而Shell脚本则是我们的"听诊器"。无需复杂的监控系统,一个精心编写的脚本就能...
- Shell 脚本基础知识
-
作为一名DevOps工程师,您可能一直在寻找自动化任务和简化工作流程。这里就涉及到shell脚本了。Shell脚本编写的先决条件:Linux基础知识。让我们开始吧!什么是内核?Linux...
- shell里面的一些特殊符号
-
特殊符号在linuxshell编程里非常常见各种符号说明当你编写Linuxshell脚本时,你会经常用到各种符号来完成不同的操作。下面是一些常用的Linuxshell编程符号及其说明:#...
- 运维必备!10 个实战的 Shell 脚本编程,酷到封神?
-
在运维日常工作中,shell脚本堪称运维神器。随着AI大模型的迅猛发展,其智能编码能力让脚本实现质的飞跃,大模型写出来的脚本,也需要经验丰富的运维工程师把关审核,确保脚本的安全性、稳定性和适配性...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- characterencodingfilter (33)
- getmonth (34)
- label换行 (33)
- android studio 3 0 (34)
- html转js (35)
- 索引的作用 (33)
- checkedlistbox (34)
- xmlhttp (35)
- mysql更改密码 (34)
- 权限777 (33)
- htmlposition (33)
- 学校网站模板 (34)
- textarea换行 (34)
- 轮播 (34)
- asp net三层架构 (38)
- bash (34)