6 文件保存功能优化
6 文件保存功能优化
6.1 开发流程
流程说明
实现保存文件的功能,包含以下逻辑:
- 检查当前是否有已打开的文件
- 如果没有打开的文件,弹出保存文件对话框让用户选择保存位置
- 将文本编辑框中的内容写入到文件中
代码实现
voidWidget::on_btnSave_clicked(){if(!file.isOpen()){QString fileName=QFileDialog::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 context=ui->textEdit->toPlainText();out<<context;}修正
按上述代码进行后续工作,会发现存在一个bug,如图所示
这是错误的功能,原因在于如果文件已经处于 isOpen() 状态,直接创建了 QTextStream 并写入。此时,文件指针通常停留在上次写入结束的位置,或者因为没有指定“清空”模式,导致新内容直接追加或覆盖在旧内容后面。
对于一个记事本的“保存”功能,通常逻辑是:用当前编辑器里的全部内容,覆盖掉文件里的旧内容。
修正代码实现
voidWidget::on_btnSave_clicked(){// 检查是否已经有文件名。// 如果 file.fileName() 为空,说明是新建的文件,需弹出对话框让用户选择保存路径if(file.fileName().isEmpty()){QString fileName=QFileDialog::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 context=ui->textEdit->toPlainText();out<<context;file.close();this->setWindowTitle(file.fileName()+" - Evesakura's text");}