由于作者第一次写博客,并且水平有限,有不足之处希望大家指出。
所以废话不多说直接上核心代码边说边看。
参考文档百度API翻译文档
如果你没有账号请你先去注册一个,注册位置:http://api.fanyi.baidu.com/product/11
因为本人才开始学习,可能一些命名还不规范,一些异常还未做判定,请各位手下留情,附上程序源码。需要代码的请私信我或者直接下载。
优快云下载地址:https://download.youkuaiyun.com/download/luck_anan/12908828
代码重构于2020年10月4日,上传GitHub并同步更新优快云下载地址
编译环境为qt5.9.9 MinGW 32bit 可在Linux发行版 deepin 15.11上完美运行。
GitHub仓库地址https://github.com/anan1995/QT_Translation
如果你觉得文章可以的话请麻烦点赞支持谢谢。
by luck_an
2020年12月13日,感谢@举个栗子木提交的一个反馈,当然也让我学习了一些东西。GitHub仓库已经更新。优快云因为一些你们知道的问题我就不更新了,简单说一下问题所以在就是。QT线程run()函数里面不能去调用他的成员的Socket。个人理解因为run函里面已经是另一个线程了,相当于我们在跨线程调用Socket,这样貌似是不行的,有兴趣的兄弟可以参考这篇博客:https://blog.youkuaiyun.com/lzjsqn/article/details/56287267
如何修改请看评论。或者你看了上面那篇博客你就知道怎么改了,很简单。
#defing MY_APID 2015063000000001 //这个位置定义你的开发账号如 2015063000000001
#defing MY_APID_KEY "12345678" //这个位置定义你的开发密匙如: 12345678
int Widget::function_data()
{
QString MD5;
char salt[60];
sprintf(salt,"%d",rand()); //获取随机数
QString cText=ui->text->text(); //获取待翻译的文本
QString sign=QString("%1%2%3%4")\
.arg(MY_APID).arg(cText).arg(salt).arg(MY_APID_KEY);//连接加密文件 宏MY_APID 是你的开发账号 宏MY_APID_KEY 是你的开发者密匙
QByteArray str = QCryptographicHash::hash(sign.toUtf8(),QCryptographicHash::Md5);
MD5.append(str.toHex());//生成md5加密文件
QString myurl=QString("http://api.fanyi.baidu.com/api/trans/vip/translate?" \
"q=%1&from=%2&to=%3&appid=%4""&salt=%5&sign=%6")\
.arg(cText).arg(from).arg(to).arg(MY_APID).arg(salt).arg(MD5);//连接上传文本 MY_APID 是你的开发账号
/*
大概是这样一串东西http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
*/
m_Manager->get(QNetworkRequest(QUrl(myurl)));//发送上传;
//得到返回值触发槽函数int replyFinished()
//在.h中定义 QNetworkAccessManager * m_Manager; 然后在构造函数中new一下
//在new m_Manager后需要连接以下槽函数
//connect(m_Manager,&QNetworkAccessManager::finished,this,&Widget::replyFinished);
return 1;
}
int Widget::replyFinished(QNetworkReply *reply)
{
QJsonParseError jsonError;
QByteArray all=reply->readAll();//获得api返回值
/* 大概是这样的一个东西
{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"\u82f9\u679c"}]}
你需要解码 */
QJsonDocument json = QJsonDocument::fromJson(all, &jsonError);
QJsonObject object = json.object();//json转码;
QString cResult;
if(object.contains("error_code"))
{
int nResult=object.value("error_code").toInt();
switch (nResult) {
case 52001:
cResult ="52001 请求超时 重试";
break;
case 52002:
cResult ="52002 系统错误 重试";
break;
case 54000:
cResult ="54000 必填参数为空";
break;
case 54001:
cResult ="54001 签名错误";
break;
case 54003:
cResult ="54003 速度过快访问频率受限";
break;
case 54004:
cResult ="54004 账户余额不足";
break;
case 54005:
cResult ="54005 请求频繁";
break;
case 58002:
cResult ="58002 服务关闭";
break;
default:
cResult ="其他错误";
break;
}
}
else {
QJsonArray value = object.value("trans_result").toArray();//一次解码
/*
{"from":"en","to":"zh",
"trans_result":[{"src":"apple","dst":"\u82f9\u679c"}]}
第一次解码
*/
QJsonObject object1=value.at(0).toObject();//二次解码开【】括号;
/*
{"src":"apple","dst":"\u82f9\u679c"}
第二次解码
*/
//from=object.value("from").toString();
cResult=object1.value("dst").toString();//得到翻译结果
}
ui->text_send->setText(cResult);
reply->deleteLater();
return 1;
}
用到的头文件有
#include<QCryptographicHash>//md5加密的库
#include<QtNetwork>
#include<QJsonObject>
#include<QJsonDocument>
#include<QDesktopServices>
#include<QAction>
当然你还需要在.pro里面添加network的库
QT += network
运行结果: