思路:将自己需要翻译的内容添加到百度翻译的api里面,然后通过get方法发送请求,异步接收返回的json格式数据并解析,然后将解析后的内容显示到界面。
步骤:
1.要实现该功能首先需要百度api的相关信息,因此需要先去百度翻译开放平台官网注册或者登录账号然后获取通用翻译API的appid和密钥,基础班不要钱但是有限制;
2.生成标签。
Step1. 拼接字符串1:
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678得到字符串1:“2015063000000001apple143566028812345678”
Step2. 计算签名:(对字符串1做MD5加密)
sign=MD5(2015063000000001apple143566028812345678),得到sign=f89f9594663708c1605f3d736d01d2d4;也就是将自己的appid,翻译内容,随机码,密钥拼接在一起然后调用MD5生成签名并拼接在网址的后面
3.利用get方法发送请求
4.通过信号与槽机制接受数据并解析
5.将解析后的数据进行处理
最终结果图:
代码:
Widget.h
#include <QWidget>
#include <QWidget>
#include <QNetworkAccessManager> //网页请求方法管理类
#include <QNetworkReply> //网页应答数据的类型,提供数据获取的方法
#include <QNetworkRequest> //网页请求管理
#include <QJsonDocument> //json文本
#include <QJsonArray> //json数组
#include <QJsonObject> //json对象
#include <QJsonValue> //json的value数值QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QNetworkAccessManager *manager;private slots:void on_pushButton_clicked();void reply(QNetworkReply *);void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
Widget.cpp
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);manager=new QNetworkAccessManager(this); connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(reply(QNetworkReply *))); //管理信号与槽,实现异步接收数据ui->textEdit_2->setReadOnly(true); //将显示文本的组件设为只读
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{QString API = "http://api.fanyi.baidu.com/api/trans/vip/translate?q=" //网址+ui->textEdit->toPlainText().toUtf8()+"&from=auto&appid=20220928001357934&salt=1435660288&sign="; //参数:输入框获取的文本信息,源语言设为自动,appid,salt,sign//以下计算签名signQString MD5;QString passWd="20220928001357934"+ui->textEdit->toPlainText().toUtf8()+"1435660288jZhYimIN7ASjGwdVQ14F";QByteArray str;str = QCryptographicHash::hash(passWd.toUtf8(),QCryptographicHash::Md5);MD5.append(str.toHex());API=API+MD5; //将签名拼接到网址后面if(ui->comboBox->currentText()=="英翻中") //判断combobox里面的内容从而判断需要翻译的目标语言然后拼接到网址后面API=API+"&to=zh";elseAPI=API+"&to=en";QNetworkRequest quest;quest.setUrl(QUrl(API));manager->get(quest); //发送请求
}void Widget::reply(QNetworkReply *reply)
{ui->textEdit_2->clear(); //先情况显示组件里面的所有信息QString all = reply->readAll(); //接收读取的所有信息(json格式)//以下为解析json格式QJsonParseError jsonError;QJsonDocument json = QJsonDocument::fromJson(all.toUtf8(),&jsonError);if (jsonError.error == QJsonParseError::NoError){if (json.isObject()){QJsonObject rootObj = json.object();if(rootObj.contains("trans_result")){QJsonValue resultValue = rootObj.value(QString("trans_result"));QString mean = "";QJsonArray array = resultValue.toArray();for(int i = 0;i < array.size();i++){QJsonObject explains = array.at(i).toObject();if(explains.contains("dst")){QJsonValue dst = explains.value(QString("dst"));mean = mean + dst.toString();}}ui->textEdit_2->append(mean); //将解析后的结果显示在显示组件上}}}ui->textEdit_3->append(ui->textEdit->toPlainText()+" "+ui->textEdit_2->toPlainText()); //添加翻译的记录
}void Widget::on_pushButton_2_clicked()
{ui->textEdit_3->clear(); //情况翻译记录
}