一、實現簡易文本編輯器
- 主要用到帶菜單欄的窗口,而非單一窗口。QT已經寫好相關操作,就不在重新造輪子了
- 功能設計:新建文本文檔,打開文件,保存文件,另存為
這次不同于之前直接可以在控件上面右擊槽了;而是需要自己手動去進行連接信號與槽
private slots:void newTextAction(); //新建文檔void openTextAction(); //打開文檔void saveTextAction(); //保存文檔void saveAnotherAction(); //文檔另存為//構造函數中,連接信號與槽
connect(ui->new_file_Action, &QAction::triggered, this, &MainWindow::newTextAction);
connect(ui->open_file_Action, &QAction::triggered, this, &MainWindow::openTextAction);
connect(ui->save_file_Action, &QAction::triggered, this, &MainWindow::saveTextAction);
connect(ui->save_another_file_Action, &QAction::triggered, this, &MainWindow::saveAnotherAction);
- 新建文本文檔:將之前的內容清空
void MainWindow::newTextAction()
{ui->textEdit->clear();this->setWindowTitle("新建文本文檔.txt");
}
- 打開文檔,讀取里面內容
void MainWindow::openTextAction()
{QString current_path = QCoreApplication::applicationFilePath(); //獲取當前文件路徑QString file_Name = QFileDialog::getOpenFileName(this, tr("打開文件"),current_path,tr("Text files (*.txt *.c *.cpp)"));if(file_Name.isNull()){QMessageBox::warning(this, "警告","請選擇一個文件");}else{QFile file(file_Name);if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;QTextStream in(&file);QString content = in.readAll();ui->textEdit->setText(content);file.close();//記錄當前路徑m_current_file_path = file_Name;}
}
- 保存文檔,將編輯框里面的內容寫入文檔中<=============>將內存中的數據持久化到磁盤上
void MainWindow::saveTextAction()
{//如果當前沒有打開文件,那么就另存為if(m_current_file_path.isEmpty()){this->saveAnotherAction();return;}QFile file(m_current_file_path);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QMessageBox::warning(this, "錯誤","無法保存文件");return;}QTextStream out(&file);out<<ui->textEdit->toPlainText();file.close();QMessageBox::information(this, "成功","保存文件");
}
- 和保存功能一樣,不過需要新添選擇新路徑這一項
void MainWindow::saveAnotherAction()
{QString current_path = QCoreApplication::applicationFilePath(); //獲取當前文件路徑QString save_path = QFileDialog::getSaveFileName(this, tr("保存文件"),current_path,tr("Text files (*.txt *.c *.cpp)"));if(save_path.isNull()){QMessageBox::warning(this, "警告","請選擇保存位置");}else{QFile file(save_path);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){QMessageBox::warning(this, "錯誤", "無法保存文件");return;}QTextStream out(&file);out<<ui->textEdit->toPlainText();file.close();//更新當前路徑m_current_file_path = save_path;//設置標題this->setWindowTitle(QFileInfo(save_path).fileName());QMessageBox::information(this, "成功","保存文件");}
}
- 實現下快捷鍵操作,需要添加處理按鍵的響應函數
void MainWindow::keyPressEvent(QKeyEvent *event)
{if (event->modifiers() & Qt::ControlModifier){switch(event->key()){case Qt::Key_N: this->newTextAction(); break;case Qt::Key_O: this->openTextAction(); break;case Qt::Key_S:{if(event->modifiers() & Qt::ShiftModifier){this->saveAnotherAction();}else{this->saveTextAction();}break;}default:QMainWindow::keyPressEvent(event); // 調用基類處理}}else{QMainWindow::keyPressEvent(event); // 調用基類處理}
}
二、問題:
2.1 如果文件過大,比如10個G的txt文件,這樣操作,肯定不行,那怎么辦?
- 采用分塊讀取,比如每次讀取4kb
- 采用內存映射,將文件的部分內容直接映射到內存當中
類似數據庫當中的分頁或者瀏覽器,app看小說的滑動欄;實現起來稍微有點復雜,需要記錄上一次以及下一次分塊的內容,方便快速加載出來
Code