【qt】MDI多文档界面开发

2024-06-08 00:36
文章标签 文档 qt 开发 界面 mdi

本文主要是介绍【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的编辑界面。

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

这篇关于【qt】MDI多文档界面开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040746

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1