文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能
文章目录
- 1 文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能
- 1.1 打开文件
- 1.2 保存文件
- 1.3 文件另存为
- 1.4 新建文件
- 1.5 软件关闭
1 文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能
在Qt项目我们应该尽量将界面代码与功能代码分离开,所以槽函数单独放在一个文件里,文件名命名为MainWindowSlots。文件目录结构如下:
我们需要解决一个关键问题:如何判断是否存在未保存的数据?
- 我们需要利用QPlainTextEdit中能够触发与编辑操作相关信号的功能。
解决方案如下:
槽函数实现如下:
void MainWindow::onTextChanged()
{if( !m_isTextChanged ){setWindowTitle("*" + windowTitle());}m_isTextChanged = true;
}
槽函数声明:
信号与槽的绑定省略,下面只给出关键操作代码。
1.1 打开文件
打开文件操作流程图:
关键代码如下:
#include "MainWindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>
#include <QTextStream>
#include <QDebug>void MainWindow::showErrorMessage(QString message)
{QMessageBox msg(this);msg.setWindowTitle("Error");msg.setText(message);msg.setIcon(QMessageBox::Critical);msg.setStandardButtons(QMessageBox::Ok);msg.exec();
}int MainWindow::showQueryMessage(QString message)
{QMessageBox msg(this);msg.setWindowTitle("Query");msg.setText(message);msg.setIcon(QMessageBox::Question);msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);return msg.exec();
}QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
{QString ret = "";QFileDialog fd(this);QStringList filters;QMap<QString, QString> map;const char* filterArray[][2] ={{"Text Files (*.txt)", ".txt"},{"All Files (*)", "*" },{NULL, NULL }};for(int i=0; filterArray[i][0]!=NULL; i++){filters.append(filterArray[i][0]);map.insert(filterArray[i][0], filterArray[i][1]);}fd.setWindowTitle(title);fd.setAcceptMode(mode);fd.setFilters(filters);if( mode == QFileDialog::AcceptOpen ){fd.setFileMode(QFileDialog::ExistingFile);}if( fd.exec() == QFileDialog::Accepted ){ret = fd.selectedFiles()[0];if( mode == QFileDialog::AcceptSave ){QString postfix = map[fd.selectedFilter()];if( (postfix != "*") && !ret.endsWith(postfix) ){ret = ret + postfix;}}}return ret;
}
QString MainWindow::saveCurrentData(QString path)
{QString ret = path;if( ret == "" ){ret = showFileDialog(QFileDialog::AcceptSave, "Save");}if( ret != "" ){QFile file(ret);if( file.open(QIODevice::WriteOnly | QIODevice::Text) ){QTextStream out(&file);out << mainEditor.toPlainText();file.close();setWindowTitle("NotePad - [ " + ret + " ]");m_isTextChanged = false;}else{showErrorMessage(QString("Save file error! \n\n") + "\"" + ret + "\"");ret = "";}}return ret;
}void MainWindow::preEditorChange()
{if( m_isTextChanged ){int r = showQueryMessage("Do you want to save the changes to file?");switch(r){case QMessageBox::Yes:saveCurrentData(m_filePath);break;case QMessageBox::No:m_isTextChanged = false;break;case QMessageBox::Cancel:break;}}
}void MainWindow::openFileToEditor(QString path)
{if( path != "" ){QFile file(path);if( file.open(QIODevice::ReadOnly | QIODevice::Text) ){mainEditor.setPlainText(QString(file.readAll()));file.close();m_filePath = path;m_isTextChanged = false;setWindowTitle("NotePad - [ " + m_filePath + " ]");}else{showErrorMessage(QString("Open file error! \n\n") + "\"" + path + "\"");}}
}void MainWindow::onFileOpen()
{preEditorChange();if( !m_isTextChanged ){QString path = showFileDialog(QFileDialog::AcceptOpen, "Open");openFileToEditor(path);}
}
1.2 保存文件
保存文件操作流程图:
关键代码如下:
void MainWindow::onFileSave()
{QString path = saveCurrentData(m_filePath);if( path != "" ){m_filePath = path;}
}
1.3 文件另存为
文件另存为操作流程图:
关键代码如下:
void MainWindow::onFileSaveAs()
{QString path = saveCurrentData();if( path != "" ){m_filePath = path;}
}
1.4 新建文件
新建文件流程图如下:
关键代码如下:
void MainWindow::onFileNew()
{preEditorChange();if( !m_isTextChanged ){mainEditor.clear();setWindowTitle("NotePad - [ New ]");m_filePath = "";m_isTextChanged = false;}
}
1.5 软件关闭
流程图如下:
关键代码如下:
void MainWindow::closeEvent(QCloseEvent* e)
{preEditorChange();if( !m_isTextChanged ){QMainWindow::closeEvent(e);}else{e->ignore();}
}
同时我们也把菜单栏的exit选项实现下,具体的槽函数如下:
void MainWindow::onFileExit()
{close();
}
参考资料:
- QT实验分析教程
文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能相关推荐
- 文本编辑器实现打开帮助文件的功能
文章目录 1 文本编辑器实现打开帮助文件的功能 1 文本编辑器实现打开帮助文件的功能 打开外部文件: QDesktopServices提供了一系列桌面开发相关的服务接口. 通过QDesktopServ ...
- html创建目录6,VB6选择文件夹的时候有新建文件夹按钮
VB6选择文件夹的时候有新建文件夹按钮 Option Explicit Public Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As S ...
- Spring Boot集成Ueditor富文本编辑器,实现图片上传,视频上传,返回内容功能并且通过OSS转换为链接并且解决Spring Security静态资源访问以及跨域问题
学习自https://cloud.tencent.com/developer/article/1452451 现在是晚上22点,刚刚和我们的前端交流完了富文本编辑器的一些意见和看法 还是老样子 需求 ...
- 百度富文本编辑器ueditor支持上传mp3格式等音频文件的方法
百度富文本编辑器ueditor算得上比较强大的了,但是有一个比较令人难受的问题,就是不支持本地上传音频文件.ueditor自带的mp3功能是直接在百度音乐里面搜索加进去的,显而易见这个不是我们想要的, ...
- C++实现文件保存为ANSI/UTF-8/UCS-2文件
题记: 有时候 统一与规范可以解决很多问题. 曾经使用C++进行文件操作一直困惑我,为什么中文就乱码了呢?为什么在NotePad++上能够正常显示,然而在NotePad上显示行号就乱了呢? 解决上述问 ...
- python下载文件保存_从URL下载文件并将其保存在Python文件夹中
尝试使用stream选项:import os import requests def download(url: str, dest_folder: str): if not os.path.exis ...
- python文件保存在哪里_Python 的文件保存路径
原博文 2019-06-02 12:12 − 1.保存在当前代码同级的目录下: 2.保存在代码文件夹外面一层的新文件夹(data文件夹与代码文件夹同级)里: 3.保存在下一级的子文件夹里 ... 相关 ...
- linux新建文件夹明率,linux新建文件和文件夹命令
1.touch命令 touch命令用来修改文件的访问时间.修改时间.如果没有指定时间,则将文件时间属性改为当前时间. 当指定文件不存在,touch命令变为创建该文件. 语法: touch [-acm] ...
- 不能右键新建html文件,win7右键无新建文件夹 win7图片库无法新建文件夹
win7右键没有新建文件夹怎么回事,该如何解决 点击开始菜单,点击"所有程序"-"附件",点击"记事本": win7右键新建只有文件夹和快捷 ...
最新文章
- Kubernetes — 安装 Dashboard UI
- opencv3 for python 之 创建图片绘制简单几何图形
- 19-6/24作业:求四位会员卡号之和
- JavaScript类型·对象·函数
- 开源纯C#工控网关+组态软件(四)上下位机通讯原理
- MongoDB 字段拼接 $concat(aggregation)
- 使用Webtask.io创建一个简单的REST API端点
- Python下载网络图片方法汇总与实现
- evil twin_Evil-Twin框架:用于测试WiFi安全性的工具
- php和html开发工具,常用的php开发工具有哪些?
- 【自考总结】寒冬里的温暖
- PHPCMS 模板标签
- 关于mysql叙述中错误的是什么_以下关于MySQL的叙述中,错误的是( )。_学小易找答案...
- Hadoop之基础概念
- python和java那个更难_python难还是java难
- 【UE4从零开始 082】全局光照
- JSP Commons-FileUpload 组件实现文件上传
- 扣哒世界入选第33届国际信息学奥赛IOI专项赛
- Git 彻底删除大文件
- Android原生图表库调研
热门文章
- linux内核态串口读写程序,linux 0.11 内核学习 -- rs_io.s,串口汇编代码
- 【Paper】2013_Cooperative control of multi-agent systems 二阶动态一致性
- 2.6 更多导数例子-深度学习-Stanford吴恩达教授
- 2021/6/20~22 每天学习python 30分钟 -了解python - python的运算符
- 【PC工具】更新win10关闭更新工具,接速度最快最好用的文件内容搜索工具:searchmyfiles...
- 树莓派的九周年: 9 件事你可能不知道
- 小程序自动化测试--测试3
- RF设计天线 PI型匹配layout注意事项–物联网设计小技巧
- 使用docker部署一个直接可用的puppet服务端
- 检查单 2015-05-15-01