日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 文本編輯器實現打開文件、保存文件、文件另存為、新建文件、軟件關閉的功能
      • 1.1 打開文件
      • 1.2 保存文件
      • 1.3 文件另存為
      • 1.4 新建文件
      • 1.5 軟件關閉

1 文本編輯器實現打開文件、保存文件、文件另存為、新建文件、軟件關閉的功能

在Qt項目我們應該盡量將界面代碼與功能代碼分離開,所以槽函數單獨放在一個文件里,文件名命名為MainWindowSlots。文件目錄結構如下:

我們需要解決一個關鍵問題:如何判斷是否存在未保存的數據?

  • 我們需要利用QPlainTextEdit中能夠觸發與編輯操作相關信號的功能。

解決方案如下:

槽函數實現如下:

void MainWindow::onTextChanged() {if( !m_isTextChanged ){setWindowTitle("*" + windowTitle());}m_isTextChanged = true; }

槽函數聲明:

信號與槽的綁定省略,下面只給出關鍵操作代碼。

1.1 打開文件

打開文件操作流程圖:

關鍵代碼如下:

#include "MainWindow.h" #include <QFileDialog> #include <QMessageBox> #include <QFile> #include <QTextStream> #include <QDebug>void MainWindow::showErrorMessage(QString message) {QMessageBox msg(this);msg.setWindowTitle("Error");msg.setText(message);msg.setIcon(QMessageBox::Critical);msg.setStandardButtons(QMessageBox::Ok);msg.exec(); }int MainWindow::showQueryMessage(QString message) {QMessageBox msg(this);msg.setWindowTitle("Query");msg.setText(message);msg.setIcon(QMessageBox::Question);msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);return msg.exec(); }QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title) {QString ret = "";QFileDialog fd(this);QStringList filters;QMap<QString, QString> map;const char* filterArray[][2] ={{"Text Files (*.txt)", ".txt"},{"All Files (*)", "*" },{NULL, NULL }};for(int i=0; filterArray[i][0]!=NULL; i++){filters.append(filterArray[i][0]);map.insert(filterArray[i][0], filterArray[i][1]);}fd.setWindowTitle(title);fd.setAcceptMode(mode);fd.setFilters(filters);if( mode == QFileDialog::AcceptOpen ){fd.setFileMode(QFileDialog::ExistingFile);}if( fd.exec() == QFileDialog::Accepted ){ret = fd.selectedFiles()[0];if( mode == QFileDialog::AcceptSave ){QString postfix = map[fd.selectedFilter()];if( (postfix != "*") && !ret.endsWith(postfix) ){ret = ret + postfix;}}}return ret; } QString MainWindow::saveCurrentData(QString path) {QString ret = path;if( ret == "" ){ret = showFileDialog(QFileDialog::AcceptSave, "Save");}if( ret != "" ){QFile file(ret);if( file.open(QIODevice::WriteOnly | QIODevice::Text) ){QTextStream out(&file);out << mainEditor.toPlainText();file.close();setWindowTitle("NotePad - [ " + ret + " ]");m_isTextChanged = false;}else{showErrorMessage(QString("Save file error! \n\n") + "\"" + ret + "\"");ret = "";}}return ret; }void MainWindow::preEditorChange() {if( m_isTextChanged ){int r = showQueryMessage("Do you want to save the changes to file?");switch(r){case QMessageBox::Yes:saveCurrentData(m_filePath);break;case QMessageBox::No:m_isTextChanged = false;break;case QMessageBox::Cancel:break;}} }void MainWindow::openFileToEditor(QString path) {if( path != "" ){QFile file(path);if( file.open(QIODevice::ReadOnly | QIODevice::Text) ){mainEditor.setPlainText(QString(file.readAll()));file.close();m_filePath = path;m_isTextChanged = false;setWindowTitle("NotePad - [ " + m_filePath + " ]");}else{showErrorMessage(QString("Open file error! \n\n") + "\"" + path + "\"");}} }void MainWindow::onFileOpen() {preEditorChange();if( !m_isTextChanged ){QString path = showFileDialog(QFileDialog::AcceptOpen, "Open");openFileToEditor(path);} }

1.2 保存文件

保存文件操作流程圖:

關鍵代碼如下:

void MainWindow::onFileSave() {QString path = saveCurrentData(m_filePath);if( path != "" ){m_filePath = path;} }

1.3 文件另存為

文件另存為操作流程圖:

關鍵代碼如下:

void MainWindow::onFileSaveAs() {QString path = saveCurrentData();if( path != "" ){m_filePath = path;} }

1.4 新建文件

新建文件流程圖如下:

關鍵代碼如下:

void MainWindow::onFileNew() {preEditorChange();if( !m_isTextChanged ){mainEditor.clear();setWindowTitle("NotePad - [ New ]");m_filePath = "";m_isTextChanged = false;} }

1.5 軟件關閉

流程圖如下:

關鍵代碼如下:

void MainWindow::closeEvent(QCloseEvent* e) {preEditorChange();if( !m_isTextChanged ){QMainWindow::closeEvent(e);}else{e->ignore();} }

同時我們也把菜單欄的exit選項實現下,具體的槽函數如下:

void MainWindow::onFileExit() {close(); }

參考資料:

  • QT實驗分析教程
  • 總結

    以上是生活随笔為你收集整理的文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。