1. 程式人生 > >Qt 檔案的新建、開啟、儲存、另存為 (改進版本)

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