生活随笔
收集整理的這篇文章主要介紹了
文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1 文本編輯器實(shí)現(xiàn)打開文件、保存文件、文件另存為、新建文件、軟件關(guān)閉的功能
- 1.1 打開文件
- 1.2 保存文件
- 1.3 文件另存為
- 1.4 新建文件
- 1.5 軟件關(guān)閉
1 文本編輯器實(shí)現(xiàn)打開文件、保存文件、文件另存為、新建文件、軟件關(guān)閉的功能
在Qt項(xiàng)目我們應(yīng)該盡量將界面代碼與功能代碼分離開,所以槽函數(shù)單獨(dú)放在一個(gè)文件里,文件名命名為MainWindowSlots。文件目錄結(jié)構(gòu)如下:
我們需要解決一個(gè)關(guān)鍵問題:如何判斷是否存在未保存的數(shù)據(jù)?
- 我們需要利用QPlainTextEdit中能夠觸發(fā)與編輯操作相關(guān)信號(hào)的功能。
解決方案如下:
槽函數(shù)實(shí)現(xiàn)如下:
void MainWindow
::onTextChanged()
{if( !m_isTextChanged
){setWindowTitle("*" + windowTitle());}m_isTextChanged
= true
;
}
槽函數(shù)聲明:
信號(hào)與槽的綁定省略,下面只給出關(guān)鍵操作代碼。
1.1 打開文件
打開文件操作流程圖:
關(guān)鍵代碼如下:
#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 保存文件
保存文件操作流程圖:
關(guān)鍵代碼如下:
void MainWindow
::onFileSave()
{QString path
= saveCurrentData(m_filePath
);if( path
!= "" ){m_filePath
= path
;}
}
1.3 文件另存為
文件另存為操作流程圖:
關(guān)鍵代碼如下:
void MainWindow
::onFileSaveAs()
{QString path
= saveCurrentData();if( path
!= "" ){m_filePath
= path
;}
}
1.4 新建文件
新建文件流程圖如下:
關(guān)鍵代碼如下:
void MainWindow
::onFileNew()
{preEditorChange();if( !m_isTextChanged
){mainEditor
.clear();setWindowTitle("NotePad - [ New ]");m_filePath
= "";m_isTextChanged
= false
;}
}
1.5 軟件關(guān)閉
流程圖如下:
關(guān)鍵代碼如下:
void MainWindow
::closeEvent(QCloseEvent
* e
)
{preEditorChange();if( !m_isTextChanged
){QMainWindow
::closeEvent(e
);}else{e
->ignore();}
}
同時(shí)我們也把菜單欄的exit選項(xiàng)實(shí)現(xiàn)下,具體的槽函數(shù)如下:
void MainWindow
::onFileExit()
{close();
}
參考資料:
QT實(shí)驗(yàn)分析教程
總結(jié)
以上是生活随笔為你收集整理的文本编辑器实现打开文件、保存文件、文件另存为、新建文件、软件关闭的功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。