第6篇 Qt5基础(六)实现Qt文本编辑功能
2017-3-7 22:45| 发布者: yafeilinux| 查看: 11733| 评论: 0|原作者: yafeilinux
Qt开源社区›门户›精品文章›精品教程›查看内容
摘要 : 前面已经在主窗口中添加了菜单和工具栏,这一篇我们将实现基本的文本编辑功能。在开始正式写程序之前,先要考虑一下整个流程。因为这里要写一个记事本一样的程序,所以最好先打开Windows中的记事本,进行一些简单的 ...
版权声明

该文章原创于Qt开源社区(www.qter.org),作者yafeilinux,转载请注明出处!可以到这里讨论本文章!
导语

前面已经在主窗口中添加了菜单和工具栏,这一篇我们将实现基本的文本编辑功能。在开始正式写程序之前,先要考虑一下整个流程。因为这里要写一个记事本一样的程序,所以最好先打开Windows中的记事本,进行一些简单的操作,然后考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上去的,不要设想一下子写出所有的功能。我们这里先实现新建文件、保存文件和文件另存为三个功能,然后再添加其他功能。
环境:Windows 7 + Qt 5.8.0(包含QtCreator 4.2.1)
正文

一、实现新建文件、文件保存和另存为功能
1.首先来分析下整个流程,当新建文件时,要考虑是否保存正在编辑的文件,如果需要保存,还要根据该文件以前是否保存过,从而进行保存或者另存为操作。下面我们根据这里的分析来添加需要的函数和对象。
2.首先打开Qt Creator,然后打开上一篇的项目。
3.在mainwindow.h文件类声明的public部分进行函数声明:
void newFile();   // 新建操作
bool maybeSave(); // 判断是否需要保存
bool save();      // 保存操作
bool saveAs();    // 另存为操作
bool saveFile(const QString &fileName); // 保存文件
这里的几个函数就是用来完成功能逻辑的,下面会添加它们的定义来实现相应的功能。因为这几个功能联系紧密,所以这几个函数会相互调用。
4.然后在private部分添加变量定义:
// 为真表示文件没有保存过,为假表示文件已经被保存过了
bool isUntitled;
// 保存当前文件的路径
QString curFile;
这里的isUntitled是一个标志,用来判断文档是否被保存过,而curFile用来保存当前打开的文件的路径。
5.下面到mainwindow.cpp文件,先添加头文件包含:
#include <QMessageBox>
#include <QPushButton>
#include <QFileDialog>
#include <QTextStream>
然后在构造函数中添加如下代码来进行一些初始化操作:
// 初始化文件为未保存状态
isUntitled = true;
// 初始化文件名为"未命名.txt"
curFile = tr("未命名.txt");
// 初始化窗口标题为文件名
setWindowTitle(curFile);
    这里设置了在启动程序时窗口标题显示文件的名字,效果如下图所示。
6.下面添加那几个函数的定义。
首先添加新建文件操作的函数:
这里先使用maybeSave()来判断文档是否需要保存,如果已经保存完了,则新建文档,并进行初始化。下面添加maybeSave()函数的定义:
    这里先使用了isModified()来判断文档是否被更改了,如果被更改了,则弹出对话框让用户选择是否进行保存,或者取消操作。如果取消操作,那么就返回false,什么都不执行。下面添加save()函数的定义:
    如果文档以前没有保存过,那么执行另存为操作saveAs(),如果已经保存过,那么调用saveFile()执行文件保存操作。下面添加saveAs()函数的定义:
这里使用QFileDialog来实现了一个另存为对话框,并且获取了文件的路径,然后使用文件路径来保存文件。下面添加saveFile()函数的定义:
该函数执行真正的文件保存操作。先是使用一个QFile类对象来指向要保存的文件,然后使用文本写入方式将其打开。打开后再使用QTextStream文本流将编辑器中的内容写入到文件中。
这里使用了很多新的类,以后对自己不明白的类都可以去帮助里进行索引,这也许是我们以后要做的最多的一件事了。对于其中的英文解释,最好想办法弄明白大意,其实网上也有一些中文的翻译,但最好还是从一开始就尝试着看英文原版的帮助,这样以后才不会对中文翻译产生依赖。
7.设置菜单功能。双击mainwindow.ui文件,在图形界面窗口下面的Action编辑器里,我们右击“新建”菜单一条,选择“转到槽”,然后选择triggered(),进入其触发事件槽。如下图所示。
同理,进入其他两个菜单的槽,将相应的操作的函数写入槽中。最终代码如下:
现在运行程序,已经能够实现新建文件、保存文件和文件另存为的功能了。
二、实现打开、关闭、退出、撤销、复制、剪切、粘贴等功能
先到mainwindow.h文件中添加public函数声明:
bool loadFile(const QString &fileName); // 加载文件
然后到mainwindow.cpp文件中添加该函数的定义:
这里的操作和saveFile()函数是相似的。下面到设计模式,分别进入其他几个动作的触发信号的槽,更改如下:
可以看到,这里复制、粘贴等常用功能QTextEdit已经实现了,我们只需要调用相应的函数即可。虽然实现了退出功能,但是,有时候会使用窗口标题栏的关闭按钮来关闭程序,这里我们需要使用关闭事件处理函数来实现相应的功能。
下面到mainwindow.h文件中,先添加头文件包含#include <QCloseEvent>,然后添加函数声明:
protected:
    void closeEvent(QCloseEvent *event); // 关闭事件
然后到mainwindow.cpp文件中添加该函数的定义:
现在可以再次运行程序,测试各个功能。关于事件的概念,会在后面的教程中讲解。
结语

这一篇中实现了最基本的编辑功能,现在还剩下查找和帮助菜单没有实现,这个会在下一篇进行介绍。如果大家想学习一个更完整的文本编辑器的实现,可以参考《Qt及QtQuick开发实战精解》一书的第1章。

QT(6) of beginer from qter.org相关推荐

  1. 【转】[Qt教程] Qt串口通信全新专题

    版权声明 该文章原创于Qter开源社区(www.qter.org),转载请注明出处! 软件:QCom跨平台串口调试助手! 更新提示 这次源码更新,与前面"串口通信专题"主要有下面两 ...

  2. [QT][问题]关于QT语言家使用失败的原因之一

    按照标准的qt使用教程 ( http://www.qter.org/forum.php?mod=viewthread&tid=781 ) 实践了下,发现除去主界面外,点开的窗口多语言没有问题. ...

  3. Qt 官方资源下载地址

    1. 所有Qt版本下载地址: http://download.qt.io/archive/qt/ 2. 所有Qt Creator下载地址: http://download.qt.io/archive/ ...

  4. 《Qt编程入门》配套代码下载

    精品教程目录 - qt qml linux 嵌入式 教程! (qter.org) yafeilinux 开源 共享 自由--嵌入未来

  5. 【QT从零开始系列12】QT学习心得及资源汇总

    文章目录 下载方面 Qt官网下载(非常慢) Qt 国内镜像站下载(较快) 书籍 C++ GUI Qt 4编程(第二版).pdf Qt5 开发实战 Qt5 开发及实例 Qt Creator快速入门 视频 ...

  6. 下载和安装Qt Creator

    一.下载安装 1. 下载 ① 访问Qt开源社区:www.qter.org,点击网页内部的下载按钮,进入历史版本下载,如下图所示 ② 点击QT Download,进入最初下载页面. ③ 进入archiv ...

  7. QT笔记第0篇__Qt基本介绍

    QT笔记第0篇__Qt基本介绍 一.引言 二.Qt简介 三.特点: 四.相关网址 五.参考资料 一.引言 由于算法的实现过程中常常需要制作一些demo来进行功能展示,最开始打算用mfc,于是看了一段几 ...

  8. 技术问答站点与论坛为什么半死不活

    前段时间写了本书,<深入浅出 Qt on Android >.在此过程中常常泡在 Qt 相关的各个论坛与博客,比方 qt-project .KDAB .CSDN移动开发 Qt 版 . qt ...

  9. MeegoTouch FW简介

    Maemo与Moblin的合体产物Meego从出生就受到了大家的关注.且不谈Meego与iPhone还有Andriod的优势与差距,相较于Maemo来说,其UI方面确实进步了不少(WP7呢?) Mee ...

最新文章

  1. 远程打包linux成镜像,ubuntu18.04 现有系统打包成镜像
  2. Enterprise Library: Data Access Application Block配置文件分析篇
  3. TensorFlow预训练模型在新图中权重部分加载
  4. 不是外链没用,而是你发的外链没用
  5. 修改linux用户时间设置,Linux用户和组的操作(九) 修改用户账号密码时间参数 chage...
  6. redis mysql 集群_Redis(五)、Redis数据库集群相关
  7. 在centos6.5中安装reids
  8. python re.sub
  9. 通俗易懂的MonteCarlo积分方法(六)
  10. 面试常考:Java中synchronized和volatile有什么区别?
  11. Python深度学习(什么是深度学习)----学习笔记(一)
  12. asp.net中配置使用Sqlite轻型数据库
  13. txt格式单词导入有道词典生词本
  14. 惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录...
  15. python中binomial_Python Numpy random.binomial() 二项分布
  16. 王阳明:<二> 立志,勤学,改过,责善
  17. 开发一款棋牌游戏的成本有多大?
  18. 有趣好玩的黑科技网站分享
  19. 在windows上安装 onlyoffice-documentserver.exefor Windows
  20. 国外交友网站开发源码 第十二篇

热门文章

  1. 社区物联网医院解决方案(智慧医疗)
  2. 『Kaggle』Elo 用户忠诚度预测
  3. 时间序列模型步骤教程(ARIMA)
  4. uni-app如何使用HBuildX云打包发布app
  5. 富春山居图的幽默犀利台词
  6. 最新中国土地市场网JS逆向分析
  7. iOS-error: unable to read property list from file: /Users/XX/Info.plist
  8. 使用Sharding-Jdbc进行数据拆分
  9. 弘辽科技:直通车双重优化
  10. Android-NFC模块学习(1)