1. 程式人生 > >我的Qt學習之路——文字檔案的讀取與寫入

我的Qt學習之路——文字檔案的讀取與寫入

為了能較好應用檔案的讀取與寫入,我編寫了一個簡易的文字編輯器

首先,先編寫新建功能:

先在mainwindow.h裡新增新建功能槽函式的宣告:

private slots:
    void newFileSlots();

然後在mainwindow.cpp中給出它的定義:
void MainWindow::newFileSlots(){
    if(ui->textEdit->document()->isModified()){ //判斷textedit裡是否有改動
        if(saveFileName.isEmpty())
            this->saveAsFileSlots();   //如果有改動,且檔案路徑為空,呼叫另存為槽函式
        else
            this->saveFileSlots();     //否則呼叫儲存函式
        if(saveFileName.isEmpty())
            return;
        ui->textEdit->clear();     //將textedit清空
    }
    else{
        ui->textEdit->clear();     //若沒有改動,直接清空
    }
}


然後是開啟功能:

在mainwindow.h中給出開啟功能的宣告,而且在這裡我還設定了一個私有成員變數saveFileName,用於儲存檔名及其路徑。

private:
    QString saveFileName;
private slots:
    void openFileSlots();

開啟功能槽函式定義:
void MainWindow::openFileSlots(){
    /*呼叫QFileDialog框,就是我們平時檔案選單下點選開啟後彈出的對話方塊,獲取所輸入的檔案路徑,"open file"是對話方塊標題,QDir::currentPath是框彈出時預設為當前路徑*/
    saveFileName=QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath());
    QFile *file=new QFile;   //申請一個檔案指標
    file->setFileName(saveFileName);   //設定檔案路徑
    bool ok=file->open(QIODevice::ReadOnly);    //布林型變數ok表示檔案以只讀方式是否開啟成功

    if(ok){
        QTextStream in(file);   //建立QTextStream流操作物件,使之與file繫結
        ui->textEdit->setText(in.readAll());   //將file中資料全部讀取,並列印到textedit框中
        file->close();
        delete file;
    }
}
儲存功能:

宣告函式同上,下面是cpp檔案中該函式的定義:

void MainWindow::saveFileSlots(){
    if(saveFileName.isEmpty()){    //若saveFileName為空,則說明該檔案是新建檔案,需執行另存為操作
        this->saveAsFileSlots();
    }
    else{
        QFile *file=new QFile;
        file->setFileName(saveFileName);
        bool ok=file->open(QIODevice::WriteOnly);

        if(ok){
            QTextStream out(file);
            out<<ui->textEdit->toPlainText();    //將textedit文字框中的純文字輸出到file中
            file->close();
            delete file;
        }
    }
}

另存為功能:

另存為功能在cpp檔案中的定義:

void MainWindow::saveAsFileSlots(){
    /*為了防止另存為對話方塊彈出後關閉導致saveFileName被賦空值,先用一個temp儲存一下並進行判斷*/
    QString tempsaveFileName=QFileDialog::getSaveFileName(this,"Save As File",QDir::currentPath());
    if(tempsaveFileName.isEmpty()){    //若為空,則說明沒有儲存上,彈出錯誤資訊
        QMessageBox::information(this,"哎呀,發生了一個小錯誤","儲存失敗");
        return;
     }
    saveFileName=tempsaveFileName;

    QFile *file=new QFile;
    file->setFileName(saveFileName);
    bool ok=file->open(QIODevice::WriteOnly);

    if(ok){
        QTextStream out(file);
        out<<ui->textEdit->toPlainText();
        file->close();
        delete file;
    }
}


有時候我們沒有儲存就點了關閉,這時候需要通過closeevent函式對關閉視窗訊息進行接納或忽略:

void MainWindow::closeEvent(QCloseEvent *event){
    if(ui->textEdit->document()->isModified()){
        this->saveFileSlots();
        if(saveFileName.isEmpty()){
            event->ignore();
        }
        event->accept();
    }
    else{
        event->accept();
    }
}

好了,最後一步,利用connect函式把發出的訊號與槽函式連線起來:
    QObject::connect(ui->newAction,SIGNAL(triggered(bool)),this,SLOT(newFileSlots()));
    QObject::connect(ui->openAction,SIGNAL(triggered(bool)),this,SLOT(openFileSlots()));
    QObject::connect(ui->saveAction,SIGNAL(triggered(bool)),this,SLOT(saveFileSlots()));
    QObject::connect(ui->saveasAction,SIGNAL(triggered(bool)),this,SLOT(saveAsFileSlots()));