简单QT文本编辑器

1. 概述

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

2. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

3. 程序设计

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

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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();
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值