文件对话框---做一个简单的文本编译器(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
效果图: