Qt5--文本编辑器

时间:2022-03-11 23:15:49

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCloseEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
void newFile(); //新建操作
bool maybeSave(); //判断是否需要保存
bool save(); //保存操作
bool saveAs(); //另存为
bool saveFile(const QString &fileName); //保存文件
bool loadFile(const QString &fileName);//加载文件

~MainWindow();

private slots:
void on_action_N_triggered();

void on_action_S_triggered();

void on_action_A_triggered();

void on_action_O_triggered();

void on_action_C_triggered();

void on_action_X_triggered();

void on_action_Z_triggered();

void on_action_X_2_triggered();

void on_action_C_2_triggered();

void on_action_V_triggered();

private:
Ui::MainWindow *ui;
bool isUntitled; // 为真表示文件没有保存过,为假表示文件已经被保存过了
QString curFile; // 保存当前文件的路径

protected:
void closeEvent(QCloseEvent *event); // 关闭事件
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QMessageBox>
#include <QPushButton>
#include <QFileDialog>
#include <QTextStream>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化文件为未保存状态
isUntitled = true;
// 初始化文件名为"未命名.txt"
curFile = tr(u8"未命名.txt");
// 初始化窗口标题为文件名
setWindowTitle(curFile);
}

MainWindow::~MainWindow()
{
delete ui;
}

/**
* @brief MainWindow::newFile
* 功能:新建文件夹操作函数
* 功能:使用maybeSave()来判断文档是否需要保存,如果已经保存完了,则新建文档,并进行初始化
*/

void MainWindow::newFile(){
if (maybeSave()) {
isUntitled = true;
curFile = tr(u8"未命名.txt");
setWindowTitle(curFile);
ui->textEdit->clear();
ui->textEdit->setVisible(true);
}
}


/**
* @brief MainWindow::maybeSave
* @return
* 功能:使用了isModified()来判断文档是否被更改了,如果被更改了,
* 则弹出对话框让用户选择是否进行保存,或者取消操作。如果取消操作,那么就返回false,什么都不执行
*/

bool MainWindow::maybeSave(){
//如果文档被更改了
if (ui->textEdit->document()->isModified()) {
// 自定义一个警告对话框
QMessageBox box;
box.setWindowTitle(tr(u8"警告"));
box.setIcon(QMessageBox::Warning);
box.setText(curFile + tr(u8"尚未保存,是否保存?"));
QPushButton *yesBtn = box.addButton(tr(u8"是(&Y)"),
QMessageBox::YesRole);
box.addButton(tr(u8"否(&N)"), QMessageBox::NoRole);
QPushButton *cancelBtn = box.addButton(tr(u8"取消"),
QMessageBox::RejectRole);
box.exec();
if (box.clickedButton() == yesBtn)
return save();
else if (box.clickedButton() == cancelBtn)
return false;
}
//如果文档没有被更改,则直接返回true
return true;
}

/**
* @brief MainWindow::save
* @return
*
* 如果文档以前没有保存过,那么执行另存为操作saveAs(),
* 如果已经保存过,那么调用saveFile()执行文件保存操作
*/


bool MainWindow::save(){
if (isUntitled) {
return saveAs();
}
else {
return saveFile(curFile);
}
}


/**
* @brief MainWindow::saveAs
* @return
* 功能:使用QFileDialog来实现了一个另存为对话框,并且获取了文件的路径,
* 然后使用文件路径来保存文件
*
*/

bool MainWindow::saveAs() {
QString fileName = QFileDialog::getSaveFileName(this,
tr(u8"另存为"),
curFile);
if (fileName.isEmpty()) return false;
return saveFile(fileName);
}

/**
* @brief MainWindow::saveFile
* @param fileName
* @return
* 功能:函数执行真正的文件保存操作。先是使用一个QFile类对象来指向要保存的文件,
* 然后使用文本写入方式将其打开。
* 打开后再使用QTextStream文本流将编辑器中的内容写入到文件中
*/

bool MainWindow::saveFile(const QString &fileName){
QFile file(fileName);

if (!file.open(QFile::WriteOnly | QFile::Text)) {

// %1和%2分别对应后面arg两个参数,/n器换行的作用
QMessageBox::warning(this, tr(u8"多文档编辑器"),
tr(u8"无法写入文件 %1: /n %2")
.arg(fileName).arg(file.errorString()));
return false;
}
QTextStream out(&file);
// 鼠标指针变为等待状态
QApplication::setOverrideCursor(Qt::WaitCursor);
out << ui->textEdit->toPlainText();
// 鼠标指针恢复原来的状态
QApplication::restoreOverrideCursor();
isUntitled = false;
// 获得文件的标准路径
curFile = QFileInfo(fileName).canonicalFilePath();
setWindowTitle(curFile);
return true;
}

bool MainWindow::loadFile(const QString &fileName){
QFile file(fileName); // 新建QFile对象
if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this,tr(u8"多文档编辑器"),
tr(u8"无法读取文件 %1 : /n%2.")
.arg(fileName).arg(file.errorString()));
return false; // 只读方式打开文件,出错则提示,并返回false
}
QTextStream in(&file); //新建文本流对象
QApplication::setOverrideCursor(Qt::WaitCursor);
// 读取文件的全部文本内容,并添加到编辑器中
ui->textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();

// 设置当前文件
curFile = QFileInfo(fileName).canonicalFilePath();
setWindowTitle(curFile);
return true;

}

void MainWindow::closeEvent(QCloseEvent *event) {
// 如果maybeSave()函数返回true,则关闭程序
if (maybeSave()) {
event->accept();
}
else {
event->ignore();
}
}

/**
* @brief MainWindow::on_action_N_triggered
* 功能:新建文件
*
*/

void MainWindow::on_action_N_triggered()
{
newFile();
}

/**
* @brief MainWindow::on_action_S_triggered
* 功能:保存文件
*
*/

void MainWindow::on_action_S_triggered()
{
save();
}

/**
* @brief MainWindow::on_action_A_triggered
* 功能:另存文件
*/

void MainWindow::on_action_A_triggered()
{
saveAs();
}

/**
* @brief MainWindow::on_action_O_triggered
* 功能:打开文件
*/

void MainWindow::on_action_O_triggered()
{
if (maybeSave()) {
QString fileName = QFileDialog::getOpenFileName(this);
// 如果文件名不为空,则加载文件
if (!fileName.isEmpty()) {
loadFile(fileName);
ui->textEdit->setVisible(true);
}
}
}

/**
* @brief MainWindow::on_action_C_triggered
* 功能:关闭文件
*/

void MainWindow::on_action_C_triggered()
{
if (maybeSave()) {
ui->textEdit->setVisible(false);
}
}

/**
* @brief MainWindow::on_action_X_triggered
* 功能:退出软件
*/

void MainWindow::on_action_X_triggered()
{
// 先执行关闭操作,再退出程序
// qApp是指向应用程序的全局指针
on_action_C_triggered();
qApp->quit();
}

/**
* @brief MainWindow::on_action_Z_triggered
* 功能:撤销操作
*/

void MainWindow::on_action_Z_triggered()
{
ui->textEdit->undo();
}

/**
* @brief MainWindow::on_action_X_2_triggered
* 功能:剪切操作
*/

void MainWindow::on_action_X_2_triggered()
{
ui->textEdit->cut();
}


/**
* @brief MainWindow::on_action_C_2_triggered
* 功能:复制操作
*/

void MainWindow::on_action_C_2_triggered()
{
ui->textEdit->copy();
}

/**
* @brief MainWindow::on_action_V_triggered
* 功能:粘贴操作
*/

void MainWindow::on_action_V_triggered()
{
ui->textEdit->paste();
}

Qt5--文本编辑器