Qt 文件的新建、打开、保存、另存为 (改进版本)

mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenu>
#include <QToolBar>
#include <QAction>
#include <QTextEdit>
#include <QtEvents>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private:
    QMenu *fileMenu;
    QMenu *printMenu;
    QToolBar *fileToolBar;
    QAction *newFileAct;
    QAction *openFileAct;
    QAction *saveFileAct;
    QAction *saveFileAsAct;
    QAction *printPreviewAct;
    QAction *printAct;

    QTextEdit *CurrentContent;
    bool CanNewOpenClose();
    int ShowWarning_BeforeNewOpenClose();
    int ShowWarning_WhenOpenFailed();
    int ShowWarning_WhenSaveFailed();
private slots:

    void CreateNewFile();
    void OpenFile();
    void SaveFile();
    void SaveFileAs();

    void SetIsCurrentContentModefied();
    void closeEvent(QCloseEvent *event);
};

#endif // MAINWINDOW_H


mainwindow.cpp


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

QString CurrentFilePath="";             //当前文件路径

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setMaximumSize(1000,800);
    this->setMinimumSize(1000,800);
    fileMenu = new QMenu(this);
    printMenu = new QMenu(this);
    fileToolBar = addToolBar("文件");

    newFileAct = new QAction(tr("新建"),this);
    openFileAct = new QAction(tr("打开"),this);
    saveFileAct = new QAction(tr("保存"),this);
    saveFileAsAct = new QAction(tr("另存"),this);

    printAct = new QAction(tr("打印"),this);
    printPreviewAct = new QAction(tr("打印预览"),this);


    fileMenu  = menuBar()->addMenu(tr("文件"));
    fileMenu->addSeparator();
    printMenu = menuBar()->addMenu(tr("打印"));

    fileMenu->addAction(newFileAct);
    fileMenu->addSeparator();
    fileMenu->addAction(openFileAct);
    fileMenu->addSeparator();
    fileMenu->addAction(saveFileAct);
    fileMenu->addSeparator();
    fileMenu->addAction(saveFileAsAct);

    printMenu->addAction(printAct);
    printMenu->addSeparator();
    printMenu->addAction(printPreviewAct);

    fileToolBar->addAction(newFileAct);
    fileToolBar->addSeparator();
    fileToolBar->addAction(saveFileAct);

    connect(newFileAct,SIGNAL(triggered()),this,SLOT(CreateNewFile())) ;
    connect(openFileAct,SIGNAL(triggered()),this,SLOT(OpenFile())) ;
    connect(saveFileAct,SIGNAL(triggered()),this,SLOT(SaveFile()) );
    connect(saveFileAsAct,SIGNAL(triggered()),this,SLOT(SaveFileAs()) );

    CurrentContent = new QTextEdit(this);
    CurrentContent->document()->setModified(false);         //将当前文本设置为未被修改
    this->setCentralWidget(CurrentContent);                 //将TextEdit设置为中央控件
    connect(CurrentContent,SIGNAL(textChanged()),this,SLOT(SetIsCurrentContentModefied()) );    //一旦文本被改变,则调用函数将文本设置为已被修改
}

MainWindow::~MainWindow()
{

}

bool MainWindow::CanNewOpenClose()      //判断是否在新建、打开、关闭之前文件是否已保存
{
    return !(CurrentContent->document()->isModified());
}

void MainWindow::CreateNewFile()        //创建新文件
{
    if(!CanNewOpenClose())
    {
        int ret = ShowWarning_BeforeNewOpenClose();     //如果文件被修改但是未保存,弹出警告对话框
        if(ret  == QMessageBox::Save)
        {SaveFile();
            return;
        }
        else if(ret == QMessageBox::Cancel)
            return;
    }

    CurrentContent->clear();
    CurrentFilePath = "";                               //因为新建了文件,所以将当前文件路径设为空
    CurrentContent->document()->setModified(false);     //将当前文本设置为未被修改
}

void MainWindow::OpenFile()
{
    if(!CanNewOpenClose())
    {
        int ret = ShowWarning_BeforeNewOpenClose();
        if(ret  == QMessageBox::Save)
        {SaveFile();
            return;
        }
        else if(ret == QMessageBox::Cancel)
            return;
    }
    QString filePath = QFileDialog::getOpenFileName(this,tr("打开文件"),tr(""),tr("文本文件(*.txt)"));
    if(filePath == "")
        return;
    CurrentFilePath = filePath;
    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        ShowWarning_WhenOpenFailed();
        CurrentFilePath = "";
        return;
    }
    QTextStream textStream(&file);
    CurrentContent->setText(textStream.readAll());
    file.close();
    CurrentContent->document()->setModified(false);
}

void MainWindow::SaveFile()
{
    if(CurrentFilePath == "")
    {
        SaveFileAs();
        return;
    }
    QFile file(CurrentFilePath);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        ShowWarning_WhenSaveFailed();
        CurrentFilePath = "";
        return;
    }
    QTextStream textStream(&file);
    file.resize(0);
    textStream<<CurrentContent->toPlainText();
    file.close();
    CurrentContent->document()->setModified(false);
}

void MainWindow::SaveFileAs()
{
    QString filePath = QFileDialog::getSaveFileName(this,tr("另存"),tr(""),tr("文本文件(*.txt)"));
    if(filePath == "")
        return;
    CurrentFilePath = filePath;
    QFile file(filePath);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        ShowWarning_WhenSaveFailed();
        CurrentFilePath = "";
        return;
    }
    QTextStream textStream(&file);
    textStream<<CurrentContent->toPlainText();
    file.close();
    CurrentContent->document()->setModified(false);
}

void MainWindow::SetIsCurrentContentModefied()
{
    CurrentContent->document()->setModified(true);      //文本被修改时调用的函数,将文本设置为已被修改
}

//下面是为了简化QMessageBox而写的函数
int MainWindow::ShowWarning_BeforeNewOpenClose()
{
    return QMessageBox::warning(this,tr("警告"),tr("还未保存"),QMessageBox::Save|QMessageBox::Ignore|QMessageBox::Cancel);
}

int MainWindow::ShowWarning_WhenOpenFailed()
{
    return QMessageBox::warning(this,tr("错误"),tr("打开文件失败"));
}
int MainWindow::ShowWarning_WhenSaveFailed()
{
    return QMessageBox::warning(this,tr("错误"),tr("保存文件失败"));
}

void MainWindow::closeEvent(QCloseEvent *event)         //关闭按钮触发时此函数被调用,检查文本是否已保存
{
    if(!CanNewOpenClose())
    {
        int ret = ShowWarning_BeforeNewOpenClose();
        if(ret == QMessageBox::Save)
        {
            SaveFile();
            return;
        }
        else if(ret == QMessageBox::Cancel)
            event->ignore();                            //忽视关闭信号
        else
            event->accept();                            //接受关闭信号,文本关闭
    }
}


main.cpp


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


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

    return a.exec();
}


  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值