QT 调用 百度翻译API 写的在线翻译程序

由于作者第一次写博客,并且水平有限,有不足之处希望大家指出。
所以废话不多说直接上核心代码边说边看。
参考文档百度API翻译文档
如果你没有账号请你先去注册一个,注册位置:http://api.fanyi.baidu.com/product/11
因为本人才开始学习,可能一些命名还不规范,一些异常还未做判定,请各位手下留情,附上程序源码。需要代码的请私信我或者直接下载。
CSDN下载地址:https://download.csdn.net/download/luck_anan/12908828


代码重构于2020年10月4日,上传GitHub并同步更新CSDN下载地址
编译环境为qt5.9.9 MinGW 32bit 可在Linux发行版 deepin 15.11上完美运行。
GitHub仓库地址https://github.com/anan1995/QT_Translation

如果你觉得文章可以的话请麻烦点赞支持谢谢。
by luck_an

2020年12月13日,感谢@举个栗子木提交的一个反馈,当然也让我学习了一些东西。GitHub仓库已经更新。CSDN因为一些你们知道的问题我就不更新了,简单说一下问题所以在就是。QT线程run()函数里面不能去调用他的成员的Socket。个人理解因为run函里面已经是另一个线程了,相当于我们在跨线程调用Socket,这样貌似是不行的,有兴趣的兄弟可以参考这篇博客:https://blog.csdn.net/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

运行结果:

在这里插入图片描述

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值