00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. 程序设计
  • 04. 软件测试
  • 05. 预留
  • 06. 附录

01. 概述

实现基本的文本编辑功能。

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. 程序设计

3.1 首先来分析下整个流程,当新建文件时,要考虑是否保存正在编辑的文件,如果需要保存,还要根据该文件以前是否保存过,从而进行保存或者另存为操作。下面我们根据这里的分析来添加需要的函数和对象。

3.2 设计菜单栏

3.3 在mainwindow.h文件类声明的public部分进行函数声明

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//新建操作void newFile();//判断是否需要保存bool maybeSave();//保存操作bool save();//另存为操作bool saveAs();//保存文件bool saveFile(const QString &fileName);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3.4 添加私有变量


private:Ui::MainWindow *ui;//真  文件没有保存过  假 文件已经保存过bool isUnSaved;//保存当前文件的路径QString curFilePath;

3.5 mainwindows.cpp源码如下

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>
#include <QPushButton>
#include <QFileDialog>
#include <QTextStream>
#include <QCloseEvent>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//初始化  未保存状态isUnSaved = true;curFilePath = tr("未命名文件.txt");//设置窗口标题setWindowTitle(curFilePath);}MainWindow::~MainWindow()
{delete ui;
}//新建文件
void MainWindow::newFile()
{//这里先使用maybeSave()来判断文档是否需要保存,如果已经保存完了,则新建文档,并进行初始化。if (maybeSave()){isUnSaved = true;curFilePath = tr("未命名文件.txt");setWindowTitle(curFilePath);ui->textEdit->clear();ui->textEdit->setVisible(true);}
}bool MainWindow::maybeSave()
{//如果文档被更改了if (ui->textEdit->document()->isModified()){QMessageBox box;box.setWindowTitle(tr("警告"));box.setIcon(QMessageBox::Warning);box.setText(curFilePath + tr("尚未保存,是否保存?"));QPushButton *yesBtn = box.addButton(tr("是(&Y)"),QMessageBox::YesRole);box.addButton(tr("否(&N)"), QMessageBox::NoRole);QPushButton *noBtn = box.addButton(tr("取消"),QMessageBox::RejectRole);box.exec();if (box.clickedButton() == yesBtn){return save();}else if (box.clickedButton() == noBtn){return false;}}return true;
}bool MainWindow::save()
{if (isUnSaved){return saveAs();}else{return saveFile(curFilePath);}
}bool MainWindow::saveAs()
{QString fileName = QFileDialog::getSaveFileName(this, tr("另存为"), curFilePath);if (fileName.isEmpty()){return false;}return saveFile(fileName);
}bool MainWindow::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 << ui->textEdit->toPlainText();//鼠标指针恢复原来的状态QApplication::restoreOverrideCursor();isUnSaved = false;//获取文件的标准路径curFilePath = QFileInfo(fileName).canonicalFilePath();setWindowTitle(curFilePath);return true;
}//加载文件
bool MainWindow::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);//读取文件的全部文本内容 并添加到编辑器中ui->textEdit->setPlainText(in.readAll());QApplication::restoreOverrideCursor();//设置当前文件curFilePath = QFileInfo(fileName).canonicalFilePath();setWindowTitle(curFilePath);return true;
}void MainWindow::closeEvent(QCloseEvent *event)
{if (maybeSave()){event->accept();}else{event->ignore();}
}void MainWindow::on_actionnew_triggered()
{newFile();
}void MainWindow::on_actionsave_triggered()
{save();
}void MainWindow::on_actionsvaeother_triggered()
{saveAs();
}void MainWindow::on_actionopen_triggered()
{if (maybeSave()){QString fileName = QFileDialog::getOpenFileName(this);//如果文件名不为空 则加载文件if (!fileName.isEmpty()){loadFile(fileName);ui->textEdit->setVisible(true);}}
}void MainWindow::on_actionclose_triggered()
{if (maybeSave()){ui->textEdit->setVisible(false);}
}void MainWindow::on_actionexit_triggered()
{//先执行关闭操作 然后在退出程序on_actionclose_triggered();qApp->quit();
}void MainWindow::on_actionCancel_triggered()
{ui->textEdit->undo();
}void MainWindow::on_actionCut_triggered()
{ui->textEdit->cut();
}void MainWindow::on_actioncopy_triggered()
{ui->textEdit->copy();
}void MainWindow::on_actionPaste_triggered()
{ui->textEdit->paste();
}

04. 软件测试

05. 预留

06. 附录

源码下载:简单Qt文本编辑器.rar

【Qt】简单QT文本编辑器相关推荐

  1. Qt Creator指定文本编辑器设置

    Qt Creator指定文本编辑器设置 指定文本编辑器设置 定义配色方案 要创建配色方案: 文件编码 指定文本编辑器设置 在"工具" >"选项" > ...

  2. 【Qt5开发及实例】16、实现一个简单的文本编辑器(over)

    实现一个简单的文本编辑器 其他具体的代码基础看前面:http://blog.csdn.net/cutter_point/article/details/42839071 1.功能 这个程序又添加了文本 ...

  3. python源码编译 带tkinter_python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

  4. python实现文本编辑器_Python-tkinter实现简单的文本编辑器

    Python-tkinter实现简单的文本编辑器 利用tkinter实现简单的文本编辑器.创建一个简单的文本编辑器.可以用读文件的方式在一个文本域里显示一些文字供用户编辑. 当用户退出程序时(通过 Q ...

  5. C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器

    15.6 实例:一个简单的文本编辑器 列表最重要的性质就是可以在不移动元素的情况下对其进行插入或删除操作.下面我们通过一个例子来说明这一点.考虑应该如何在文本编辑器中表示一个文本文件中的字符.所选用的 ...

  6. C语言项目实战之简单的文本编辑器

    预期实现三个功能,第一,可以对指定的行输入字符串:第二,删除指定行的字符串:第三,显示编辑器的行数和内容. 我们通过块链结构来实现本程序."块"的含义是每个块中可以存放多个字符,& ...

  7. gtk设计简单的文本编辑器(1)

    2019独角兽企业重金招聘Python工程师标准>>> 这是在windows下用gtk+glade+codeblocks设计的一个简单的文本编辑器. 功能:在文本视图内编辑文本后,在 ...

  8. 简单的文本编辑器C语言实现

    1.程序功能: 1.文章内容输入(可输入多行文字)2.显示当前文章内容3.进入文章内容统计菜单(包括总字数,大写字母个数,小写字母个数,数字个数,标点符号个数)4.查找文章中的字符或者字符串(显示出现 ...

  9. js简单的文本编辑器(所见即所得)

    项目页面需要一个简单的文本编辑器,网上的那些富文本编辑器功能都很强大,很多东西用不到,所以自己用js写了一个简单的文本编辑器. 代码如下: <!DOCTYPE html PUBLIC " ...

  10. python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

最新文章

  1. 【转】Visual Studio 2010 架构图之用例图(UML Use Case Diagram)
  2. 前端学习笔记2017.6.21-引入JS文件的方法
  3. boost::fusion::transform用法的测试程序
  4. 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
  5. rman report list crosscheck delete -rman常用命令。
  6. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法
  7. SQL Server 环形缓冲区(Ring Buffer) -- 环形缓冲在AlwaysOn的应用
  8. selenium下打开Chrome报错解决
  9. Lightbox插件
  10. 关于我发的这个PDF文件的理解
  11. 传教士过河java_野人和传教士渡河问题的java实现
  12. 云主机-本地内网通信OPEN-V
  13. 国外服务器https协议,AriaNg使用Https/WebSocket(安全)协议连接Aria2的方法
  14. unity FBX模型导出系统源码WRP FBX Exporter下载
  15. 触摸屏的技术类型有那些?
  16. 淘淘商城第77讲——实现商品详情页面展示
  17. Google之Stopwatch 计时器
  18. C语言中的运算符及优先级
  19. Android 与 Chrome OS 中针对大屏幕设备的更新
  20. 测试开发全栈之Python自动化 Pytest 之 fixture

热门文章

  1. one-to-one
  2. CodeForces 451A
  3. JAVA I/O流工具类TextFile
  4. VC++ 中 try-catch-finally 语句 如何在获取正常信息是写一些操作语句
  5. J2EE团队与DotNet团队如何合作开发一个系统?
  6. 关于:以前的某个程序安装已在安装计算机上创建挂起的文件操作解决办法(SQL2000)...
  7. linux设备和驱动注册,Linux驱动第五篇-----驱动注册和生成设备节点
  8. Java黑皮书课后题第6章:*6.36(几何:正多边形的面积)正多边形…计算正多边形面积的公式是area = (n*s*s) / (4*Math.tan(Math.PI / n))。输入边 长显示面积
  9. Angular2 组件与模板 -- 输入和输出属性
  10. 提升【百度网盘】下载速度