【Qt】简单QT文本编辑器

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
喜欢就支持一下吧
点赞97 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容