【qt】MDI多文档界面开发

MDI多文档界面开发

  • 一.应用场景
  • 二.界面设计
  • 三.界面类设计
  • 四.实现功能
    • 1.新建文档
    • 2.打开文件
    • 3.关闭所有
    • 4.编辑功能
    • 5.MDI页模式
    • 6.瀑布展开模式
    • 7.平铺模式
  • 五.总结

一.应用场景

类似于vs的界面功能,工具栏的功能可以对每个文档使用!

在这里插入图片描述

二.界面设计

老规矩,边做项目边学!
目标图:
在这里插入图片描述
需要蔬菜的可以dd我!

界面设计:
在这里插入图片描述
同时设为中心组件和最大化的状态设置!

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setCentralWidget(ui->mdiArea);setWindowState(Qt::WindowMaximized);
}

三.界面类设计

在这里插入图片描述
添加一个纯文本编辑器
在这里插入图片描述
并设置窗口边距:
在这里插入图片描述

四.实现功能

1.新建文档

注意界面类设计的头文件.
在这里插入图片描述
运行结果:
在这里插入图片描述

2.打开文件

先来说一说打开文件的逻辑
如果没有窗口,就先新建一个窗口,再将文件内容写入
如果有窗口,看是否已经写入了文件,如果有就重新创建一个窗口
没有写入就直接写入.

#include "formdoc.h"
#include <QMdiSubWindow>
#include <QFileDialog>
....
void MainWindow::on_actionOpen_triggered()
{bool needForm=false;//是否需要新建窗口FormDoc*form=NULL;//变化的指向if(ui->mdiArea->subWindowList().count()==0)//如果没有窗口就要新建{needForm=true;}else//有窗口的情况下{form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//指向激活的窗口,也就是当前点击的子窗口,需要用到头文件if(form->fileWrite())//如果文件已经写入就需要重新创建一个窗口{needForm=true;}}//获取文件路径名QString fileName=QFileDialog::getOpenFileName(this,"打开一个文件",QDir::currentPath(),"源文件(*.h *.cpp);;文本文件(*.txt);;所有文件(*.*)");if(fileName.isEmpty()){return;}if(needForm){form=new FormDoc(this);//创建新的窗口ui->mdiArea->addSubWindow(form);//添加到MDI容器}form->loadFile(fileName);//将文件写入窗口form->show();}

面向对象的思想对formDoc窗口进行操作和读取数据.

#ifndef FORMDOC_H
#define FORMDOC_H#include <QWidget>namespace Ui {
class FormDoc;
}class FormDoc : public QWidget
{Q_OBJECTpublic:explicit FormDoc(QWidget *parent = nullptr);~FormDoc();bool fileWrite();//文件是否写入void loadFile(const QString&fileName);//写入文件到窗口private:Ui::FormDoc *ui;bool m_fileWrite=false;
};#endif // FORMDOC_H

函数实现:

#include <QTextStream>
#include <QFileInfo>
...
bool FormDoc::fileWrite()
{return this->m_fileWrite;
}void FormDoc::loadFile(const QString&fileName)
{QFile file(fileName);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStream stream(&file);ui->plainTextEdit->clear();//读取所有的文件内容写入到窗口中ui->plainTextEdit->setPlainText(stream.readAll());file.close();//设置窗口的主题QFileInfo fileName;QString name=fileName.fileName();this->setWindowTitle(name);//写了文件,姚重新创造一个窗口this->m_fileWrite=true;}
}

运行结果:
在这里插入图片描述

3.关闭所有

void MainWindow::on_actionCloseAll_triggered()
{ui->mdiArea->closeAllSubWindows();
}

4.编辑功能

因为纯文本编辑器组件本来就有这些功能,所以我们可以用面向对象的思想在formdoc窗口来设置接口!

void MainWindow::on_actionCut_triggered()
{FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体form->cut();
}void MainWindow::on_actionCopy_triggered()
{FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体form->copy();
}void MainWindow::on_actionPaste_triggered()
{FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体form->paste();
}void MainWindow::on_actionFont_triggered()
{FormDoc*form=(FormDoc*)ui->mdiArea->activeSubWindow()->widget();//选中的窗体form->setFont();
}

formdoc.h

#ifndef FORMDOC_H
#define FORMDOC_H#include <QWidget>namespace Ui {
class FormDoc;
}class FormDoc : public QWidget
{Q_OBJECTpublic:explicit FormDoc(QWidget *parent = nullptr);~FormDoc();bool fileWrite();//文件是否写入void loadFile(const QString&fileName);//写入文件到窗口void cut();void copy();void paste();void setFont();private:Ui::FormDoc *ui;bool m_fileWrite=false;
};#endif // FORMDOC_H

formdoc.cpp

#include "formdoc.h"
#include "ui_formdoc.h"
#include <QTextStream>
#include <QFileInfo>
#include <QFontDialog>FormDoc::FormDoc(QWidget *parent) :QWidget(parent),ui(new Ui::FormDoc)
{ui->setupUi(this);this->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口时同时销毁
}FormDoc::~FormDoc()
{delete ui;
}bool FormDoc::fileWrite()
{return this->m_fileWrite;
}void FormDoc::loadFile(const QString&fileName)
{QFile file(fileName);if(file.open(QIODevice::ReadOnly|QIODevice::Text)){QTextStream stream(&file);ui->plainTextEdit->clear();//读取所有的文件内容写入到窗口中ui->plainTextEdit->setPlainText(stream.readAll());file.close();//设置窗口的主题QFileInfo fileName;QString name=fileName.fileName();this->setWindowTitle(name);//写了文件,姚重新创造一个窗口this->m_fileWrite=true;}
}void FormDoc::cut()
{ui->plainTextEdit->cut();
}
void FormDoc::copy()
{ui->plainTextEdit->copy();
}
void FormDoc::paste()
{ui->plainTextEdit->paste();
}
void FormDoc::setFont()
{bool ok;QFont font=ui->plainTextEdit->font();font=QFontDialog::getFont(&ok,font);ui->plainTextEdit->setFont(font);
}

运行结果:
在这里插入图片描述

5.MDI页模式

void MainWindow::on_actionMDI_triggered(bool checked)
{if(checked){ui->mdiArea->setViewMode(QMdiArea::TabbedView);//设置为页面模式//页面模式不能使用展开和平铺ui->actionShow->setEnabled(false);ui->actionTile->setEnabled(false);ui->mdiArea->setTabsClosable(true);//页有关闭按钮}else{ui->mdiArea->setViewMode(QMdiArea::SubWindowView);//设置为页面模式        ui->actionShow->setEnabled(true);ui->actionTile->setEnabled(true);ui->mdiArea->setTabsClosable(false);//页有关闭按钮}
}

运行结果:
在这里插入图片描述

6.瀑布展开模式

void MainWindow::on_actionShow_triggered()
{ui->mdiArea->cascadeSubWindows();
}

运行结果:
在这里插入图片描述

7.平铺模式

void MainWindow::on_actionTile_triggered()
{ui->mdiArea->tileSubWindows();
}

运行结果:
在这里插入图片描述
哈哈,搞完了,感觉有的像监控,哈哈!

五.总结

Qt提供了MDI(多文档界面),可以更方便的实现多个窗口的开发
MDI使用QMdiArea作为多个子窗体的容器。
这些子窗体,可以同享使用主窗体的工具栏和菜单栏,
适合,需要进行多个文档编辑的场景,类似VS的编辑界面。

安静 既是道路,也是终点!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JMeter接口测试工具】第二节.JMeter项目实战(上)【实战篇】

文章目录 前言项目实战零、接口测试流程一、测试数据准备二、接口功能测试三、掌握测试用例编写四、自动化脚本架构搭建总结 前言 零、接口测试流程 1、制定测试计划,分配任务 2、从 API 文档中提取接口清单&#xff1a;对 API 文档简化,提高测试效率,接口清单就是对 API 文档…

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要开…

OpenAI与核聚变公司寻求合作,白宫拨款1.8亿美元用于核聚变商业化研究

在当下&#xff0c;由 AI 引发的新一轮能源危机已经不再是一个小概率的「黑天鹅」事件&#xff0c;而是一头正在向我们猛冲而来的「灰犀牛」。 Helion Energy&#xff0c;是一家总部位于美国华盛顿州埃弗雷特的能源创业公司。 3.5研究测试&#xff1a;hujiaoai.cn 4研究测试&am…

Mysql的底层实现逻辑

Mysql5.x和Mysql8性能的差异 整体性能有所提高&#xff0c; 在非高并发场景下&#xff0c;他们2这使用区别不大&#xff0c;性能没有明显的区别。 只有高并发时&#xff0c;mysql8才体现他的优势。 2. Mysql数据存储结构Innodb逻辑结构 数据选用B树结构存储数据&#xff0…

如何画系统架构图学习

原文链接:https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E4%BB%8E%200%20%E5%BC%80%E5%A7%8B%E5%AD%A6%E6%9E%B6%E6%9E%84/51%20%E5%A6%82%E4%BD%95%E7%94%BB%E5%87%BA%E4%BC%98%E7%A7%80%E7%9A%84%E8%BD%AF%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%9B%BE%EF…

C++ 11 【可变参数模板】【lambda】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C修炼之路⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 一、新的类功能 1.1默认成员函数—…

【数据分析基础】实验三 文件操作、数组与矩阵运算

一&#xff0e;实验目的 掌握上下文管理语句with的使用方法。掌握文本文件的操作方法。了解os、os.path模块的使用。掌握扩展库Python-docx、openpyxl的安装与操作word、Excel文件内容的方法。熟练掌握numpy数组相关运算和简单应用。熟练使用numpy创建矩阵&#xff0c;熟悉常用…

新技术前沿-2024-构建个人知识库和小语言模型

OllamaWebUIAnythingLLM&#xff0c;构建安全可靠的个人/企业知识库 1 技术路线一 1.1 搭建本地大模型Ollama 1.2 搭建用户界面open WebUI 使用Docker Desktop Open-webui。它可以快速基于Ollama构筑本地UI。 如果没有科学上网&#xff0c;很可能会拉不动&#xff0c;可以试…

linux网络服务“PXE网络批量装机和Kickstart全自动化安装”

PXE网络批量装机 pxe自动装机&#xff1a; 服务端和客户端 pxe c/s 模式&#xff1a;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 无人值守 :安装选项不需要人为干预&#xf…

FlexJavaFramwork

FlexJavaFramwork架构

【高校科研前沿】广西大学博士生冯德东为一作在Habitat Int发文:区域乡村性与贫困治理变化的时空格局及相关效应——以滇桂黔石漠化地区为例

1.文章简介 论文名称&#xff1a;Spatio-temporal patterns and correlation effects of regional rurality and poverty governance change: A case study of the rocky desertification area of Yunnan-Guangxi-Guizhou, China&#xff08;区域乡村性与贫困治理变化的时空格…

从零开始搭建Electron项目(二)之例程解析

本专栏&#xff0c;前面学习了怎么下载例程并运行。 这里解析例程的构成 从零开始搭建Electron项目之运行例程-CSDN博客文章浏览阅读22次。最好的学习方式就是&#xff1a;给一段能够运行的代码示例。本文给出了例程资源&#xff0c;以及运行的步骤。在国内开发electron有一点特…

【吊打面试官系列-Mysql面试题】MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 ?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 &#xff1f; 以下是 MySQL_fetch_array 和 MySQL…

让AI做2024新高考1卷数学最后一题:AI智商横向对比!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【Python】成功解决SyntaxError: invalid syntax

【Python】成功解决SyntaxError: invalid syntax 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&am…

探索OrangePi AIpro:单板计算机的深度体验之旅

准备阶段&#xff1a;环境与资料 在开始我们的探索之旅前&#xff0c;确保您已准备好以下装备&#xff1a; OrangePi AIpro&#xff1a;我们的主角&#xff0c;一台功能强大的单板计算机。Windows 10笔记本电脑&#xff1a;作为我们的辅助工具&#xff0c;用于管理和测试。路…

SSM民宿在线预订平台的设计与实现-计算机毕业设计源码44449

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对民宿在线预订平台等问题&#xff0c;对民宿…

力扣74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a;每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示…

1.nginx介绍

介绍 是一个高性能的http和反向代理服务器。 特点 占用内存少&#xff0c;并发能力强。 nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xff0c;实现上非常注重效率&#xff0c;能经受高负载的考验&#xff0c;有报告表明能支持高达50,000个并发连接数。 基…

游戏服务器工程实践一:百万级同时在线的全区全服游戏

我应该有资格写这篇文章&#xff0c;因为亲手设计过可以支撑百万级同时在线的全区全服类型的游戏服务器架构。 若干年前我在某公司任职时&#xff0c;参与研发过一款休闲类型的游戏&#xff0c;由 penguin 厂独代。研发的时候&#xff0c;p 厂要求我们的游戏服务器要能支撑百万…