我的Qt學習之路——文字檔案的讀取與寫入
阿新 • • 發佈:2019-02-10
為了能較好應用檔案的讀取與寫入,我編寫了一個簡易的文字編輯器
首先,先編寫新建功能:
先在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()));