目录

效果展示

资料地址

源码分析

QSslConfiguration

QNetworkAccessManager

QNetworkReply

源码

源码传送门


在线翻译工具的开发调用了百度的翻译接口。通过该接口的调用我们可以学会Qt网络通信的https的接口访问调用。

qt的https网络请求访问。

注:windows和linux下都需安装openssl。

效果展示

AppSecret:百度应用的appscret

Token: 百度应用的appscret

百度应用注册地址: 百度智能云-登录

流程图

资料地址

开发地址为文档地址;机器翻译 - 文档

机器翻译 - 文档

源码分析

需要使用到网络相关的库因此需要再工程文件中提条加network

请求access_token的代码逻辑如下:

// 发送https请求前准备工作;QSslConfiguration config;QNetworkRequest request;QByteArray post_Array;QJsonDocument doc;QSslConfiguration conf = request.sslConfiguration();// https://aip.baidubce.com/oauth/2.0/tokenrequest.setUrl(QUrl(m_strTokenUrl)); request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));QByteArray postData;postData.append("grant_type=client_credentials&client_id=" +m_ptrLineEditAppSecret->text() +"&client_secret=" + m_ptrLineEditToken->text());qInfo() << "post_Array:" << post_Array;QNetworkReply *pReply = manager->post(request, postData);connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(onHttpGetError(QNetworkReply::NetworkError)));

QSslConfiguration

QSslConfiguration : ssl的配置文件.用于设置https的访问配置文件。

QNetworkAccessManager

QNetworkAccessManager 网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保存它发送的请求的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监控网络操作进度的回复信号。一个QNetworkAccessManager实例应该足以支持整个Qt应用程序。由于QNetworkAccessManager基于QObject,因此只能从它所属的线程使用它。创建QNetworkAccessManager对象后,应用程序可以使用它通过网络发送请求。提供了一组标准函数,它们接受一个请求和可选数据,每个函数都返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的任何数据。

finished信号:https访问放回成功以后的数据返回。

QNetworkReply

QNetworkReply类包含QNetworkAccessManager发送的请求的数据和头。

QNetworkReply类包含与QNetworkAccessManager发布的请求相关的数据和元数据。与QNetworkRequest一样,它包含一个URL和标题(解析和原始形式)、一些关于回复状态和回复本身内容的信息。

QNetworkReply是一种顺序访问设备,这意味着一旦从对象中读取数据,设备就不再保存数据。因此,如果需要,应用程序有责任保留这些数据。每当从网络接收到更多数据并进行处理时,就会发出readyRead()信号。

downloadProgress()信号在接收数据时也会发出,但如果对内容进行任何转换(例如,解压缩和消除协议开销),其中包含的字节数可能并不代表接收到的实际字节数。

尽管QNetworkReply是一个连接到回复内容的QIODevice,但它也会发出uploadProgress()信号,指示具有此类内容的操作的上载进度。

QtJson序列化与反序列化。

源码

完整的代码如下:

#include "mainwindow.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), m_ptrWdgMain(new QWidget()), m_ptrLabAppSecret(new QLabel("AppSecret")), m_ptrLineEditAppSecret(new QLineEdit()), m_ptrLabAppToken(new QLabel("Token")), m_ptrLineEditToken(new QLineEdit()), m_ptrLayoutApp(new QGridLayout()), m_ptrLayoutMain(new QVBoxLayout()), m_ptrTextEditInput(new QTextEdit()), m_ptrTextEditOutput(new QTextEdit()), m_ptrCmbSource(new QComboBox()), m_ptrCmbTraget(new QComboBox()), m_ptrLabText(new QLabel("翻译成")), m_ptrLayoutConfig(new QHBoxLayout()), m_ptrBtnDowork(new QPushButton("翻译")), m_strApiUrl("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1"), m_strTokenUrl("https://aip.baidubce.com/oauth/2.0/token")//  , m_strTokenUrl("https://www.baidu.com"), manager(new QNetworkAccessManager(this)), managerData(new QNetworkAccessManager(this)){initUI();initConnect();readConfig();
}MainWindow::~MainWindow() {}void MainWindow::readConfig()
{QString Path = QCoreApplication::applicationDirPath();QString endPath = Path + "/config.ini";QFileInfo fileinfo(endPath);if (!fileinfo.isFile()) {qDebug() << "文件不存在";}QSettings setting(endPath, QSettings::IniFormat);setting.beginGroup("APP");QString strAppSecret = setting.value("AppSecret", "").toString();QString strToken = setting.value("Token", "").toString();m_ptrLineEditAppSecret->setText(strAppSecret);m_ptrLineEditToken->setText(strToken);
}void MainWindow::saveConfig()
{QString Path = QCoreApplication::applicationDirPath();QString endPath = Path + "/config.ini";QFileInfo fileinfo(endPath);if (!fileinfo.isFile()) {qDebug() << "文件不存在";}QSettings setting(endPath, QSettings::IniFormat);setting.beginGroup("APP");//读配置文件//写入配置文件setting.setValue("AppSecret", m_ptrLineEditAppSecret->text());setting.setValue("Token", m_ptrLineEditToken->text());
}void MainWindow::initUI()
{m_ptrLayoutApp->addWidget(m_ptrLabAppSecret, 0, 0);m_ptrLayoutApp->addWidget(m_ptrLineEditAppSecret, 0, 1);m_ptrLineEditAppSecret->setEchoMode(QLineEdit::Password);m_ptrLayoutApp->addWidget(m_ptrLabAppToken, 1, 0);m_ptrLayoutApp->addWidget(m_ptrLineEditToken, 1, 1);m_ptrLineEditToken->setEchoMode(QLineEdit::Password);m_ptrLayoutMain->addLayout(m_ptrLayoutApp);m_ptrLayoutMain->addWidget(m_ptrTextEditInput);m_ptrLayoutConfig->addWidget(m_ptrCmbSource);m_ptrLayoutConfig->addWidget(m_ptrLabText);m_ptrLayoutConfig->addWidget(m_ptrCmbTraget);m_ptrLayoutMain->addLayout(m_ptrLayoutConfig);m_ptrCmbTraget->addItem("英语");m_ptrCmbTraget->addItem("日语");m_ptrLayoutMain->addWidget(m_ptrTextEditOutput);m_ptrLayoutMain->addWidget(m_ptrBtnDowork);m_ptrWdgMain->setLayout(m_ptrLayoutMain);setCentralWidget(m_ptrWdgMain);
}void MainWindow::initConnect()
{connect(m_ptrBtnDowork, SIGNAL(clicked()), this, SLOT(slotDowork()));connect(managerData, SIGNAL(finished(QNetworkReply *)), this,SLOT(slotGetOuput(QNetworkReply *)));connect(manager, SIGNAL(finished(QNetworkReply *)), this,SLOT(slotGetToken(QNetworkReply *)));
}void MainWindow::getToken()
{// 发送https请求前准备工作;QSslConfiguration config;QNetworkRequest request;QByteArray post_Array;QJsonDocument doc;QSslConfiguration conf = request.sslConfiguration();//    conf.setPeerVerifyMode(QSslSocket::VerifyNone);//    conf.setProtocol(QSsl::TlsV1_1);//    request.setSslConfiguration(conf);request.setUrl(QUrl(m_strTokenUrl));  // "https://www.temp.com"request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));QByteArray postData;postData.append("grant_type=client_credentials&client_id=" +m_ptrLineEditAppSecret->text() +"&client_secret=" + m_ptrLineEditToken->text());qInfo() << "post_Array:" << post_Array;QNetworkReply *pReply = manager->post(request, postData);connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(onHttpGetError(QNetworkReply::NetworkError)));
}void MainWindow::slotGetToken(QNetworkReply *reply)
{QVariant variant;QJsonParseError jsonError;QByteArray rece = reply->readAll();QJsonDocument json_doc = QJsonDocument::fromJson(rece, &jsonError);QJsonObject json_obj = json_doc.object();QJsonValue jsonRefresh_token = json_obj.value("refresh_token");QJsonValue jsonAccess_token = json_obj.value("access_token");qInfo() << "Refresh_token:" << jsonRefresh_token.toString();qInfo() << "Access_token:" << jsonAccess_token.toString();qInfo() << QString(rece);QString url = m_strApiUrl + "?access_token=" + jsonAccess_token.toString();QJsonObject jsonPostData;jsonPostData.insert("q",QJsonValue(m_ptrTextEditInput->toPlainText().toStdString().c_str()));jsonPostData.insert("from", "auto");jsonPostData.insert("to", getTarget());QByteArray strpostData = QJsonDocument(jsonPostData).toJson();qInfo() << "strpostData:" << strpostData;QNetworkRequest request;request.setUrl(QUrl(url));  // "https://www.temp.com"request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));QNetworkReply *pReply = managerData->post(request, strpostData);connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(onHttpGetError(QNetworkReply::NetworkError)));
}void MainWindow::slotGetOuput(QNetworkReply *reply)
{QByteArray rece = reply->readAll();qInfo() << rece;QJsonParseError jsonError;QJsonDocument json_doc = QJsonDocument::fromJson(rece, &jsonError);QJsonObject jsonPostData = json_doc.object();QJsonObject jsonResult = jsonPostData.value("result").toObject();QJsonValue jsontRans_result = jsonResult.value("trans_result");QJsonArray jsontRans_resulta = jsontRans_result.toArray();qInfo() << "jsontRans_resulta" << jsontRans_resulta;QJsonObject jsonDst = jsontRans_resulta.at(0).toObject();qInfo() << "json_doc2:" << jsonDst;QString strDst = jsonDst.value("dst").toString();qInfo() << "jsonDst:" << strDst;m_ptrTextEditOutput->setText(strDst);
}void MainWindow::onHttpGetError(QNetworkReply::NetworkError code)
{QMetaEnum metaMnum = QMetaEnum::fromType<QNetworkReply::NetworkError>();QString error = metaMnum.valueToKey(code);qWarning() << "地址调用失败 :" << error;
}QString MainWindow::getTarget()
{switch (m_ptrCmbTraget->currentIndex()) {case 0:return "en";case 1:return "jp";}return "jp";
}
void MainWindow::slotDowork()
{saveConfig();getToken();
}

源码传送门

点击下面跳转到源码。

QtNetWork/HttpFanyi · master · 啊渊 / QT博客案例 · GitCode

Qt网络与通信HTTPS(在线翻译工具)相关推荐

  1. QT-自动在线翻译工具,适用于国际化多语言应用

    QT-自动在线翻译工具,适用于国际化多语言应用 前言 一.演示效果 二.关键程序 三.程序下载链接 前言 有时候我们在多语言版本的时候,如果是手动翻译的话需要将我们的中文文本拷贝到百度翻译或者谷歌翻译 ...

  2. Java中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

    做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云 ...

  3. Python Web中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

    做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云 ...

  4. Translatium 19.2.1 中文版 优秀的在线翻译工具

    Translatium 是一款Mac上优秀的在线翻译工具,支持150多种语言间实时翻译,简单易用. 应用介绍 Translatium 支持150多种语言间实时翻译,还支持语音输入识别以及语音输出,支持 ...

  5. Translatium for Mac(Google在线翻译工具)

    Translatium,谷歌翻译客户端 Translatium for Mac是一款Mac上强大的翻译软件,支持150多种语言和方言,支持语言输入翻译,文本翻译,并且支持相机翻译语言,Translat ...

  6. Google在线翻译工具:Translatium for Mac支持big sur

    Translatium,谷歌翻译客户端 Translatium for Mac是一款Mac上强大的翻译软件,支持150多种语言和方言,支持语言输入翻译,文本翻译,并且支持相机翻译语言,Translat ...

  7. Translatium for Mac(Google在线翻译工具)的使用说明

    Translatium,谷歌翻译客户端 Translatium for Mac是一款Mac上强大的翻译软件,支持150多种语言和方言,支持语言输入翻译,文本翻译,并且支持相机翻译语言,Translat ...

  8. Word文件英中文互译有什么好的在线翻译工具?

    Word文件是办公最常用到的办公软件里的格式,Word书写文件很方便操作起来也比较的快,而且使用简单.因为用的多所以对它的其他需求也比较多.有的工作者用它写中文文件也有人用它写外语文件,以及工作涉及到 ...

  9. GOOGEL翻译软件测试,测试一把google的在线翻译工具

    听说google出了在线翻译的工具,而且还广受大家的好评,在美国举行的一次翻译比赛中还拿了冠军.我虽不是google的粉丝但也对google的产品挺感兴趣的,于是赶紧凑个热闹,看看伟大的google能 ...

最新文章

  1. JavaScript中window对象属性,时间等的总结
  2. php自定义弹窗,自定义弹窗Style样式
  3. 受半导体短缺及疫情影响,丰田已下调9月10月及当前财年产量预期
  4. Jmeter分布式测试-远程调用
  5. EntityFramework 元数据 设计分析
  6. Ubuntu 18.04 安装 RoboWare
  7. matlab绘制奈奎图,matlab画奈奎斯特图
  8. Linux-虚拟机使用:真机与虚拟机ping通
  9. 不平衡数据分类实证-R语言
  10. 外媒介绍全新表情密码 用emoji解锁安全吗?
  11. 全球及中国铁矿石行业供求状况与投资决策建议报告2022版
  12. 2018 最新直播接口
  13. 如果有家公司给你4300的工资,每天闲得发慌,朝九晚六,周末双休,你能坚持多久?
  14. 计算机网络技术赚钱,计算机网络技术-.ppt
  15. Tiny-DSOD: Lightweight Object Detection for Resource-Restricted Usages
  16. 佳能 c3000 系统设置改语言,win7如何更改语言 win7系统中将电脑语言改成英文的方法步骤介绍...
  17. 为什么360浏览器兼容模式文档模式默认以ie7标准渲染
  18. 《惢客创业日记》2019.03.30(周六)遗留工作进入收尾阶段
  19. 人脸识别毕业设计python_25 行 Python 代码毕业设计实现人脸识别
  20. FL1000型风电机组水冷系统用 风冷机组的研制

热门文章

  1. RV-GAN:使用新的多尺度生成对抗网络分割眼底照片中的视网膜血管结构
  2. linux rpm 启用,Linux系统启动 rpm yum
  3. 最近一周股票和年报的心得体会
  4. uniapp实现手机号一键登录功能
  5. 弥合鸿沟:一种生成内部威胁数据的实用方法(Bridging the Gap: A Pragmatic Approach to Generating Insider Threat Data )
  6. 硬刚到底!苹果正式封停Epic Games开发者账户
  7. 人均近30w,小米向3142人发放超9亿元股份奖励
  8. goahead(嵌入式Web服务器)之交叉编译、移植篇
  9. 102类花卉分类数据集(已划分,有训练集、测试集、验证集标签)
  10. python 爬取搞笑视频_Python爬取知乎上搞笑视频,一顿爆笑送给大家