文章目录

  • 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();
}

参考资料:

  1. QT实验分析教程

文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能相关推荐

  1. 文本编辑器实现打开帮助文件的功能

    文章目录 1 文本编辑器实现打开帮助文件的功能 1 文本编辑器实现打开帮助文件的功能 打开外部文件: QDesktopServices提供了一系列桌面开发相关的服务接口. 通过QDesktopServ ...

  2. html创建目录6,VB6选择文件夹的时候有新建文件夹按钮

    VB6选择文件夹的时候有新建文件夹按钮 Option Explicit Public Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As S ...

  3. Spring Boot集成Ueditor富文本编辑器,实现图片上传,视频上传,返回内容功能并且通过OSS转换为链接并且解决Spring Security静态资源访问以及跨域问题

    学习自https://cloud.tencent.com/developer/article/1452451 现在是晚上22点,刚刚和我们的前端交流完了富文本编辑器的一些意见和看法 还是老样子 需求 ...

  4. 百度富文本编辑器ueditor支持上传mp3格式等音频文件的方法

    百度富文本编辑器ueditor算得上比较强大的了,但是有一个比较令人难受的问题,就是不支持本地上传音频文件.ueditor自带的mp3功能是直接在百度音乐里面搜索加进去的,显而易见这个不是我们想要的, ...

  5. C++实现文件保存为ANSI/UTF-8/UCS-2文件

    题记: 有时候 统一与规范可以解决很多问题. 曾经使用C++进行文件操作一直困惑我,为什么中文就乱码了呢?为什么在NotePad++上能够正常显示,然而在NotePad上显示行号就乱了呢? 解决上述问 ...

  6. python下载文件保存_从URL下载文件并将其保存在Python文件夹中

    尝试使用stream选项:import os import requests def download(url: str, dest_folder: str): if not os.path.exis ...

  7. python文件保存在哪里_Python 的文件保存路径

    原博文 2019-06-02 12:12 − 1.保存在当前代码同级的目录下: 2.保存在代码文件夹外面一层的新文件夹(data文件夹与代码文件夹同级)里: 3.保存在下一级的子文件夹里 ... 相关 ...

  8. linux新建文件夹明率,linux新建文件和文件夹命令

    1.touch命令 touch命令用来修改文件的访问时间.修改时间.如果没有指定时间,则将文件时间属性改为当前时间. 当指定文件不存在,touch命令变为创建该文件. 语法: touch [-acm] ...

  9. 不能右键新建html文件,win7右键无新建文件夹 win7图片库无法新建文件夹

    win7右键没有新建文件夹怎么回事,该如何解决 点击开始菜单,点击"所有程序"-"附件",点击"记事本": win7右键新建只有文件夹和快捷 ...

最新文章

  1. Kubernetes — 安装 Dashboard UI
  2. opencv3 for python 之 创建图片绘制简单几何图形
  3. 19-6/24作业:求四位会员卡号之和
  4. JavaScript类型·对象·函数
  5. 开源纯C#工控网关+组态软件(四)上下位机通讯原理
  6. MongoDB 字段拼接 $concat(aggregation)
  7. 使用Webtask.io创建一个简单的REST API端点
  8. Python下载网络图片方法汇总与实现
  9. evil twin_Evil-Twin框架:用于测试WiFi安全性的工具
  10. php和html开发工具,常用的php开发工具有哪些?
  11. 【自考总结】寒冬里的温暖
  12. PHPCMS 模板标签
  13. 关于mysql叙述中错误的是什么_以下关于MySQL的叙述中,错误的是( )。_学小易找答案...
  14. Hadoop之基础概念
  15. python和java那个更难_python难还是java难
  16. 【UE4从零开始 082】全局光照
  17. JSP Commons-FileUpload 组件实现文件上传
  18. 扣哒世界入选第33届国际信息学奥赛IOI专项赛
  19. Git 彻底删除大文件
  20. Android原生图表库调研

热门文章

  1. linux内核态串口读写程序,linux 0.11 内核学习 -- rs_io.s,串口汇编代码
  2. 【Paper】2013_Cooperative control of multi-agent systems 二阶动态一致性
  3. 2.6 更多导数例子-深度学习-Stanford吴恩达教授
  4. 2021/6/20~22 每天学习python 30分钟 -了解python - python的运算符
  5. 【PC工具】更新win10关闭更新工具,接速度最快最好用的文件内容搜索工具:searchmyfiles...
  6. 树莓派的九周年: 9 件事你可能不知道
  7. 小程序自动化测试--测试3
  8. RF设计天线 PI型匹配layout注意事项–物联网设计小技巧
  9. 使用docker部署一个直接可用的puppet服务端
  10. 检查单 2015-05-15-01