00. 目录
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_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容