6 文件保存功能优化
6 文件保存功能优化6.1 开发流程流程说明实现保存文件的功能包含以下逻辑检查当前是否有已打开的文件如果没有打开的文件弹出保存文件对话框让用户选择保存位置将文本编辑框中的内容写入到文件中代码实现voidWidget::on_btnSave_clicked(){if(!file.isOpen()){QString fileNameQFileDialog::getSaveFileName(this,tr(Save File),D:/AAA/untitled.txt,tr(Text (*.txt *.doc)));file.setFileName(fileName);if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()file open error;}this-setWindowTitle(fileName- MyNoteBook);}QTextStreamout(file);out.setCodec(ui-comboBox-currentText().toStdString().c_str());QString contextui-textEdit-toPlainText();outcontext;}修正按上述代码进行后续工作会发现存在一个bug如图所示这是错误的功能原因在于如果文件已经处于 isOpen() 状态直接创建了 QTextStream 并写入。此时文件指针通常停留在上次写入结束的位置或者因为没有指定“清空”模式导致新内容直接追加或覆盖在旧内容后面。对于一个记事本的“保存”功能通常逻辑是用当前编辑器里的全部内容覆盖掉文件里的旧内容。修正代码实现voidWidget::on_btnSave_clicked(){// 检查是否已经有文件名。// 如果 file.fileName() 为空说明是新建的文件需弹出对话框让用户选择保存路径if(file.fileName().isEmpty()){QString fileNameQFileDialog::getSaveFileName(this,tr(Save File),D:/AAA/untitled.txt,tr(Text (*.txt *.doc)));if(fileName.isEmpty())return;// 如果用户点击了“取消”则退出函数file.setFileName(fileName);// 设置文件名}// 如果文件当前是打开状态比如刚读取完先把它关闭。// 这样是为了确保接下来能以 Truncate清空模式重新进入。if(file.isOpen()){file.close();}// 以“只写 文本 清空”模式打开文件// QIODevice::Truncate 会在写入前把文件原有的内容完全擦除。if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)){qDebug()file open error;return;}// 执行写入操作QTextStreamout(file);out.setCodec(ui-comboBox-currentText().toStdString().c_str());QString contextui-textEdit-toPlainText();outcontext;file.close();this-setWindowTitle(file.fileName() - Evesakuras text);}