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

文件对话框---做一个简单的文本编译器(3)

在前面的基础上,把保存文件的功能完成,同时解决了中文的显示异常。

最终的原因,原来是QT与VS之间采用的字符编码不同,只要编写一个头文件,就可以实现所有中文问题的完美解决!

文件打开显示部分的改进代码

打开文件:

string gbk_name =GBK::FromUnicode(filepath);

fp =fopen(gbk_name.c_str(), "a+");

显示在EDIT上

ui.TextEdit->setPlainText(GBK::ToUnicode(ch));

 

 

保存文件

voidMyGUI::onBtnSaveClicked()

{

//选择要打开的文件

QStringfilepath = QFileDialog::getSaveFileName(

this,// 父窗口

GBK::ToUnicode("保存")// 标题caption

);

 

//为空时表示用户取消了操作,没有选中任何文件

if(filepath.length() > 0)

{

QStringtext = ui.TextEdit->toPlainText();

stringgbk_text = GBK::FromUnicode(text);

stringgbk_filename = GBK::FromUnicode(filepath);

 

FILE*fp = fopen(gbk_filename.c_str(), "wb");

fwrite(gbk_text.c_str(),1, gbk_text.length(), fp);

fclose(fp);  // 关闭文件

}

 

 

需要额外添加的头文件文 GBK.h

 

#ifndef_QT_GBK_H

#define_QT_GBK_H

 

#include<QString>

#include<QTextCodec>

#include<string>

usingstd::string;

 

classGBK

{

public:

//QString(Unicode) -> std::string (GBK)

staticstring FromUnicode(const QString& qstr)

{

QTextCodec*pCodec = QTextCodec::codecForName("gb2312");

if(!pCodec)return "";        

 

QByteArrayarr = pCodec->fromUnicode(qstr);

stringcstr = arr.data();

returncstr;

}

 

//std::string (GBK) -> QString(Unicode)

staticQString ToUnicode(const string& cstr)

{

QTextCodec*pCodec = QTextCodec::codecForName("gb2312");

if(!pCodec)return "";

 

QStringqstr = pCodec->toUnicode(cstr.c_str(), cstr.length());

returnqstr;

}

 

};

#endif

 

 

效果图:

 

 

 


相关文章:

  • 缓冲文件系统和非缓冲文件系统
  • 利用线程读取文件(带有进度条)
  • 类和对象
  • 什么是内联函数
  • 构造函数
  • 析构函数
  • new和malloc
  • static和const
  • 友元函数
  • 函数模板定义
  • 类模板定义+用类模板写一个入栈出栈的程序
  • 模板的全特化与偏特化
  • cout
  • cin
  • C++文件输入输出流+输入输出二进制文件(自定义对象)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • AHK 中 = 和 == 等比较运算符的用法
  • Android系统模拟器绘制实现概述
  • express如何解决request entity too large问题
  • FineReport中如何实现自动滚屏效果
  • interface和setter,getter
  • JavaScript新鲜事·第5期
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • oschina
  • Python3爬取英雄联盟英雄皮肤大图
  • SpriteKit 技巧之添加背景图片
  • tweak 支持第三方库
  • Web Storage相关
  • 彻底搞懂浏览器Event-loop
  • 简单易用的leetcode开发测试工具(npm)
  • 将回调地狱按在地上摩擦的Promise
  • 七牛云假注销小指南
  • 前端自动化解决方案
  • 如何合理的规划jvm性能调优
  • 设计模式 开闭原则
  • 用jQuery怎么做到前后端分离
  • 走向全栈之MongoDB的使用
  • 白色的风信子
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 数据可视化之下发图实践
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第一天)包装对象、作用域、创建对象
  • (多级缓存)多级缓存
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三分钟)速览传统边缘检测算子
  • (转)我也是一只IT小小鸟
  • (转)一些感悟
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net core 6 redis操作类
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET6 命令行启动及发布单个Exe文件
  • .NET框架类在ASP.NET中的使用(2) ——QA