废了一下午的时间,结合着课本终于把这个实例给弄出来了,中间错误百出,真是学习的过程贼痛苦。

原来写过一篇java实现的多文档编辑器,那个确实是自己写的,界面及其难看,毫无健壮性,操作稍微错一步就得崩,不过用这玩 意应付老师还可以的哈哈。

下面写的是使用C++的Qt界面设计的一个多文本编辑器,界面好看了许多,而且操作起来不存在bug,功能上可能少一点,没有添加颜色和字体功能,但是看着比较舒服,可以实现多文档的平铺和层叠,有一定的可操作性。还有我这个是使用Qt creator编辑器写的,可以去Qt中文社区下载安装,很简单。

这是我的一个项目文件目录,其中.ui文件是界面设计文件,Qt是所使用xml文件保存界面设计的代码,和java有所区别。源文件的三个C++文件是具体的实现方法和子窗口实现方法。头文件中定义和相关的函数。代码挺多的大约四五百行左右,所以不太容易看懂,但是里面添加了许多的注释,应该大致的调用结构可以看得懂,一些具体的方法就不用管了。

下面展示一下成果界面

可以实现文件的打开,保存,多文档平铺和层叠,关闭,撤销,复制,粘贴,剪切以及前一个和后一个文档的切换,我觉得比较好的是细节做得还是挺好的,比如没有打开文件的时候工具栏禁止操作,对文档是否被修改进行*号标记,显示文本的行号和列号信息,自动显示滚动条,操作成功的信息提醒等一些细节上的实现。

下面代码段是其中mdichild.cpp文件的源码,主要是实现一些子窗口的功能,比如文件的打开和加载,文件的另存为等一些操作。

#include "mdichild.h"
#include<QFile>
#include<QTextStream>
#include<QMessageBox>
#include<QFileInfo>
#include<QApplication>
#include<QFileDialog>
#include<QCloseEvent>
#include<QPushButton>
MdiChild::MdiChild(QWidget *parent) :QTextEdit(parent)
{setAttribute(Qt::WA_DeleteOnClose);isUntitled = true;}
//新建文件
void MdiChild::newFile()
{static int sequenceNumber = 1;isUntitled = true;curFile = tr("未命名文档%1.txt").arg(sequenceNumber++);setWindowTitle(curFile+"[*]"+tr("-多文档编辑器"));connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));}
//文档是否被修改
void MdiChild::documentWasModified()
{setWindowModified(document()->isModified());
}void MdiChild::setCurrentFile(const QString &fileName)
{   //canonicalFilePath可以出去路径中的符号curFile = QFileInfo(fileName).canonicalFilePath();//文件已经被保存过了isUntitled = false;//文档没有被更改document()->setModified(false);//窗口不显示*号setWindowModified(false);//设置窗口标题,userFriendlyCurrentFile()返回文件名setWindowTitle(userFriendlyCurrentFile()+"[*]");
}
//加载文件
bool MdiChild::loadFile(const QString &fileName)
{QFile file(fileName);if(!file.open(QFile::ReadOnly|QFile::Text)){QMessageBox::warning(this,tr("多文档编辑器"),tr("无法读取文件%1:\n%2.").arg(fileName).arg(file.errorString()));return false;}//新建文本流对象QTextStream in(&file);//设置鼠标状态为等待状态QApplication::setOverrideCursor(Qt::WaitCursor);//读取文件的全部内容,并添加到编辑器setPlainText(in.readAll());//恢复鼠标状态QApplication::restoreOverrideCursor();//设置当前文件setCurrentFile(fileName);connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));return true;
}QString MdiChild::userFriendlyCurrentFile()
{//从文件路径提取文件名return QFileInfo(curFile).fileName();
}//保存操作
bool MdiChild::save()
{//如果文件没有被保存过,则执行另存为操作,否则直接保存文件if(isUntitled){return saveAs();}else {return saveFile(curFile);}
}//另存为
bool MdiChild::saveAs()
{QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);//获取文件路径,如果为空,则返回false,否则保存文件if(fileName.isEmpty()){return false;}else {return saveFile(fileName);}
}bool MdiChild::saveFile(const QString &fileName)
{QFile file(fileName);if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr("多文档编辑器"),tr("无法写入文件%1::\n%2.").arg(fileName).arg(file.errorString()));return false;}QTextStream out(&file);QApplication::setOverrideCursor(Qt::WaitCursor);out<<toPlainText();QApplication::restoreOverrideCursor();setCurrentFile(fileName);return true;
}//关闭操作
void MdiChild::colseEvent(QCloseEvent *event)
{if(maybeSave()){event->accept();}else{event->ignore();}
}bool MdiChild::maybeSave()
{if(document()->isModified()){QMessageBox box;box.setWindowTitle(tr("多文档编辑器"));box.setText(tr("是否保存对”%1“的修改").arg(userFriendlyCurrentFile()));box.setIcon(QMessageBox::Warning);QPushButton *yesBtn = box.addButton(tr("是"),QMessageBox::YesRole);box.addButton(tr("否"),QMessageBox::NoRole);QPushButton *cancelBtn = box.addButton(tr("取消"),QMessageBox::RejectRole);//弹出对话框,让用户选择是否保存修改box.exec();if(box.clickedButton() == yesBtn){return save();}else if(box.clickedButton()==cancelBtn){return false;}}//如果没有更改,直接返回truereturn true;
}

另外一个cpp文件的代码较多就不贴了,而且中间图片都是在项目文件夹之下,还要环境配置的问题,有代码也不一定能运行,而且csdn很多资源都是半成品就传了上去,深受其害。所以我把项目打包成了exe文件,加上一些配置文件可以在电脑上直接运行,省去了很多事。压缩包里面包括可执行文件和项目所有的源文件。

附上下载链接:

https://download.csdn.net/download/cumtlz/10727791

多文档文本编辑器(Qt)相关推荐

  1. 如何用Qt设计一个多文档文本编辑器

    目录 前言 一.设计目标 二.效果展示 三.设计过程 1.设计思路 1.1文件的打开和新建 1.2设置字体和字号 1.3设置字型和颜色 1.4设置文字对齐撤销等 2.核心代码 总结 前言 学习了有关Q ...

  2. 【JAVA程序设计教程 第三版 雍俊海】8.8 编写多文档文本编辑器

    题目: 请编写一个简单的多文档文本编辑器.要求可以输入文件名,从指定文件中读取数据,并显示在图形界面上.可以编辑显示在图形界面上的数据,而且可以将显示在图形界面上数据写入指定文件中. 思路: ①:首先 ...

  3. c#多文档文本编辑器

    大概长这样,功能就图里的那些,还算丰富,目前也没发现有什么bug.希望本篇文章会对大家有所帮助 一.主窗口额外所需的引用 using System.Drawing.Text; using System ...

  4. 在线文档技术-编辑器篇

    这是在线文档技术的第二篇文章,本文将对目前市面上所有的主流编辑器和在线文档进行一次深入的剖析和研究,从而使大家对在线文档技术有更深入的了解,也让更多人能够参与其开发与设计中来. 注意:出于对主流文档产 ...

  5. 文件夹取消了小米云服务器,小米云服务上线文档在线编辑器:随时保存历史版本...

    IT 之家 11 月 27 日消息   小米官方宣布,互联网时代下,丢失重要文档,就像 80 年代丢了钱包一样痛.为了解决丢失文档的噩梦.小米云服务上线新功能--文档在线编辑器. IT 之家获悉,用户 ...

  6. 基于 SpringBoot实现文档管理编辑器

    访问[WRITE-BUG数字空间]_[内附完整源码和文档] 本项目实现功能如下:注册.登录和个人资料修改:文档编辑:Markdown 文档的阅读和编辑.发布:文档管理: 使用 Cookies 保存登录 ...

  7. PowerPoint (PPT) 文档 文本内容提取

    ppt文档里面 有很多文字,有些时候需要提取出来在WORD里面做素材用,网上搜索了下,首推的是pptConverttodoc,可我下载下来试验了下,要么是空白,要么不全,或许与我的系统环境有关.其它还 ...

  8. word文件文档文本恢复转换器

    遇到损坏的word文件(关键字:DOC文件修复,破损的word文件,无法读取/打开的word文件),其实不用在网上到处去找什么"文本恢复转换器"下载,现在的WORD中都有自带的. ...

  9. C#读取word文档文本

    读取word,首先得添加引用,不同的word版本对应着不同的引用 部分版本对应引用如下: Microsoft Word 11.0 object library对应Office2003 Microsof ...

  10. 【Houdini Vex】代码高亮、可查看帮助文档的编辑器Sublime_Text

    在学习编写vex之前,我们先下载一个可以提供vex高亮的编辑器 名字是:Sublime_Text 官网:http://www.sublimetext.com 安装之后打开 按ctrl+shift+P下 ...

最新文章

  1. 云平台设计系统,助力业务快速开发
  2. URLClassLoader的使用
  3. 基于UDP高性能传输协议UDT
  4. Docker中快速安装Mysql
  5. 链接生成动态二维码图片显示在页面上
  6. 2017.9.6 Robot 失败总结
  7. 使用GDAL对DEM进行彩色渲染
  8. 计算机控制系统电梯控制,计算机控制系统实验报告1.doc
  9. Flutter Dio 报错is not a subtype of type ‘DioError‘
  10. Ubuntu终端中字体颜色含义
  11. 漫画告诉你:区块链到底是什么?
  12. Android 13小米首批支持机型曝光 这4款机型在内
  13. 英语兔音标学习之双元音
  14. JAVA-正则表达式匹配教程 使用正则表达式匹配字符串 截取匹配到的字符串
  15. Excel的简单编程
  16. 2020年如何通过GitHub学生包认证Azure学生认证
  17. Spring Task定时任务
  18. wow服务器合并信息,《魔兽世界》台服合并部分服务器_网络游戏魔兽世界_新浪游戏_新浪网...
  19. web程序设计(3)——使用CSS设计新闻网页
  20. 推荐 10 个不错的网络监视工具

热门文章

  1. PADS Layout 滴泪、敷铜和删除
  2. 约瑟夫环数据结构课程设计详解
  3. 蓝桥杯官网 试题 PREV-94 历届真题 矩阵计数【第十届】【决赛】【研究生组】【C++】解法
  4. native2ascii命令用法详解
  5. 最好用的php编程软件_php 编程软件 php编程软件有哪些
  6. pq控制,vf控制和droop控制仿真模型
  7. SEO的艺术(原书第2版)
  8. 商务网站建设与维护【7】
  9. Python 每日一题(计算数值和)
  10. 【开发心得】json解析报错Uncaught SyntaxError: Unexpected identifier的解决方法