当前位置: 首页 > 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.jsqmd.com/news/659559/

相关文章:

  • Phi-4-mini-reasoning企业审计合规:推理日志留存与敏感信息过滤方案
  • SQL更新日期格式不统一_利用DATE_FORMAT函数批量修正
  • Pixel Couplet Gen应用场景:线下展会扫码生成专属像素春联互动装置
  • Open Claw AI 零代码构建企业 HTML5 网站实战指南:30分钟从部署到上线
  • 精读双模态视频融合论文系列十一|湖南大学原创 UAVD-Mamba 封神!可变形 Token+Mamba 跨模态融合碾压 !
  • 除了场景切换,Unity的淡入淡出还能这么玩?创意应用与性能优化小贴士
  • 【2026奇点智能技术大会权威解码】:AI测试代码生成的5大颠覆性突破与落地陷阱预警
  • 解读核心Maintainer观点|Presto 不只是版本升级!从查询引擎到湖仓执行层,AI Infra 新方向
  • S2-Pro命令行工具开发:使用Node.js构建模型管理CLI
  • C/C++程序员必看:别再手动转换进制了!用cout和printf轻松搞定二进制/八进制/十六进制输出
  • Python黑客攻防(十)后门程序的隐蔽通信与反检测
  • 大模型推理流式响应卡顿诊断指南(2024实时通信性能黄金阈值清单)
  • 用YOLOv8给番茄‘看病’:手把手教你训练一个田间病害检测模型(附4万张数据集)
  • 【CocosCreator实战】Button组件进阶:打造动态交互与状态管理
  • 从铺地砖到写代码:用骨牌问题带你彻底搞懂动态规划(附Python/Java/C++三种解法)
  • 2026 最新|Open Claw AI 零代码生成 HTML5 企业静态网站 30 分钟上手
  • 生物信息学Python实战指南:从基因组分析到蛋白质结构的完整技能树
  • 别再复制粘贴了!封装一个通用的ECharts Vue组件,在管理后台(ElementUI)里复用圆环图、折线图
  • AI语音克隆爆发前夜(2026奇点大会技术白皮书首发):全球首份商用风险评级矩阵与企业自检工具包
  • 简单理解:国民技术股份有限公司和他的芯片类型
  • 千兆网络变压器选型实战:从PoE等级到PHY匹配,一站式解决工程师的三大难题
  • Matlab多折线图对比分析:从数据到学术图表的一站式实现
  • AI对大数据分析岗位的冲击或影响分析(附:什么是数字孪生)
  • Vue 3 + Teleport 实战:搞定全屏播放器里弹窗不显示的坑(附完整代码)
  • 简单理解:Sub-1GHz(Sub-1 Gigahertz)指工作频率低于 1GHz 的无线通信频段
  • Element-UI表单进阶:精准校验单个与多个字段的实战指南
  • 2025届必备的十大降AI率助手推荐
  • 2026年必备:几款AI降重工具高效解决查重率过高难题 - 降AI实验室
  • 树莓派4B安装VLC播放器全攻略:从命令行到图形界面完整指南
  • pymongo,一个灵活的 Python 库!