当前位置: 首页 > news >正文

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");}
http://www.cnnetsun.cn/news/1956708.html

相关文章:

  • 解读核心Maintainer观点|Presto 不只是版本升级!从查询引擎到湖仓执行层,AI Infra 新方向
  • 解析CSV文件处理中的常见问题与解决方案
  • 为什么你的浏览器下载需要Motrix WebExtension?终极效率提升指南
  • Visual C++运行库终极解决方案:三步告别DLL缺失烦恼
  • 通义千问2.5-7B-Instruct新手入门:无需代码基础搭建智能对话系统
  • S2-Pro大模型VMware虚拟机Ubuntu环境配置一站式指南
  • Wan2.2-I2V-A14B开发者指南:基于API封装私有视频生成SaaS服务
  • Qwen3.5-9B零基础部署:5分钟本地跑通,笔记本也能玩转原生多模态
  • Pixel Epic · Wisdom Terminal 物联网(IoT)后端开发:处理海量传感器数据的智能分析平台
  • 写HTML就能出视频?HyperFrames安装使用教程及资源分享
  • Pixel Couplet Gen惊艳案例:海外华人社区用Pixel Couplet Gen传播春节文化
  • Golang go mod vendor怎么用_Golang vendor教程【必备】
  • Z-Image Turbo实战指南:4步生成高清图像全流程
  • 告别虚拟机黑窗口:VSCode Remote-SSH直连OpenEuler 20.03 LTS开发环境搭建全记录
  • 福瑞康系统APP开发功能实例分析
  • AbMole 丨 FIN56 通过降解 GPX4 与调控 CoQ10 诱导铁死亡
  • 谁有GdiView工具呀
  • 共探智能医疗与人工智能的新时代 | IHAI 2026
  • 不锈钢彩涂板哪家信誉好
  • 告别printf调试:用NRF52832的UART串口实现高效日志输出(附SDK15.3配置)
  • 常见网络攻击
  • 别再混用了!LDO、DCDC和电压基准源的精度到底差多少?附选型避坑指南
  • JavaScript 高级教程:闭包、原型、异步——从底层原理到实战应用
  • LLM生成代码如何逃过SAST/SCA检测?:一文拆解3层语义级审查盲区与可落地的增强审查Checklist(含YAML模板)
  • Python 虚拟环境完全指南:避免包管理混乱
  • Qwen3-0.6B-FP8快速部署教程:从镜像启动到模型调用的全流程
  • MusePublic圣光艺苑完整指南:CSDN图床集成+真迹分享链接生成机制
  • 保姆级攻略投票平台
  • 笔试训练48天:删除公共字符
  • STM32实战:旋转编码器防抖的3种方法对比(附F407完整代码)