摘要:

基于百度api的在线词典是优衣酱结合百度API开发文档和网上教程JSON花了两天完成的,项目非常简陋,功能得益于百度翻译强大的翻译能力。现在发布到博客上,供大家交流学习。

项目演示:

项目演示

说明:共包含两个界面:登录界面和翻译界面。

登录界面,需要输入appid和密匙,基于开发文档要求,要通过salt来获得签名,界面上salt一栏可以自定义输入0到2147483648任意的数值,也可以留空让程序自己生成32位二进制转十进制的随机数。

翻译界面,编辑发送区,点击翻译按钮,可以将翻译文本回显在接收区,默认中文转英文,可以自定义转换方式,但是必须遵照支持文档的要求来。

代码:

electronicdictionary.h

#ifndef ELECTRONICDICTIONARY_H
#define ELECTRONICDICTIONARY_H#include <QWidget>#include <QNetworkRequest>          //http网址管理类
#include <QNetworkReply>            //网页回复数据管理类
#include <QNetworkAccessManager>    //http请求方式管理类namespace Ui {
class electronicDictionary;
}class electronicDictionary : public QWidget
{Q_OBJECTpublic:explicit electronicDictionary(QWidget *parent = 0,QString appid = "", QString key = "" , QString salt = "");~electronicDictionary();private slots:void on_teSend_textChanged();void on_pbTranslate_clicked();void httpReply(QNetworkReply *);void on_leFrom_editingFinished();void on_leTo_editingFinished();void on_pbSwitch_clicked();private:Ui::electronicDictionary *ui;QString url;QString q;QString from;QString to;QString salt;QString sign;QString signMd5;QString appid;QString key;QNetworkRequest *request;QNetworkAccessManager *manager;QString networkReply;QJsonObject stringToJson(const QString jsonString);void md5Encryption();void urlEncode();
};#endif // ELECTRONICDICTIONARY_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "electronicdictionary.h"
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_leAppId_editingFinished();void on_leKey_editingFinished();void on_pbEncryption_clicked();void on_leSalt_editingFinished();
private:Ui::Widget *ui;QString salt;QString appid;QString key;electronicDictionary * dictionary;
};#endif // WIDGET_H

electronicdictionary.cpp

#include "electronicdictionary.h"
#include "ui_electronicdictionary.h"
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonArray>
#include <QVariant>
#include <QTextCodec>
electronicDictionary::electronicDictionary(QWidget *parent,QString appid, QString key, QString salt):QWidget(parent),ui(new Ui::electronicDictionary)
{ui->setupUi(this);//默认初始化from = "en";to = "zh";this->appid = appid;this->key = key;this->salt = salt;
}electronicDictionary::~electronicDictionary()
{delete ui;
}void electronicDictionary::on_teSend_textChanged()
{q = ui->teSend->toPlainText();
}void electronicDictionary::on_pbTranslate_clicked()
{md5Encryption();
//    urlEncode();//设置访问地址url = "http://api.fanyi.baidu.com/api/trans/vip/translate?";url +=  "q=" + q +"&from=" + from +"&to=" + to +"&appid=" + appid +"&salt=" + salt +"&sign=" + signMd5;qDebug() << "url=" << url;//实例化网址管理request = new QNetworkRequest;//1、设置具体的网址request->setUrl(url);//2、实例化http请求方式manager = new QNetworkAccessManager;//关联信号 finished, 当网页回复数据时触发,此时才能在槽函数中,读取请求到的数据connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(httpReply(QNetworkReply *)));//3、get方法请求(get方法上传)manager->get(*request);
}void electronicDictionary::httpReply(QNetworkReply * reply)
{networkReply = "";networkReply.append(reply->readAll());qDebug() << "networkReply" << networkReply;QJsonObject obj = stringToJson(networkReply);if(obj.contains("trans_result")){QJsonValue val = obj.value("trans_result");if(val.isArray()){QJsonArray array = val.toArray();//            qDebug() << array;    //将该对象一次性打印出来qDebug() << array.at(0);if(array.at(0).isObject()){QJsonObject obj = array.at(0).toObject();if(obj.contains("dst")){QString utf8Reply = obj.value("dst").toString();qDebug() << "utf8Reply" << utf8Reply;ui->teRecv->clear();ui->teRecv->insertPlainText(utf8Reply);}}}else{qDebug() << "错误:"<<val;}}
}QJsonObject electronicDictionary::stringToJson(const QString jsonString)
{//QTextCodec类提供文本编码之间的转换//codecForName():搜索所有已安装的qtextcodec对象,并返回与名称最匹配的对象;//匹配是不区分大小写的。如果找不到与名称匹配的编解码器,则返回0。QTextCodec *tc = QTextCodec::codecForName("UTF-8");//防止中文乱码//指示编译器指定名称的参数不在函数正文中使用。这可用于抑制编译器警告,同时允许在其签名中使用有意义的参数名称定义函数。Q_UNUSED(tc);QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8());if (jsonDocument.isNull()){qDebug() << "数据解析有误"; //判断是否解析出问题}QJsonObject jsonObject = jsonDocument.object();//    qDebug() << "jsonObject" << jsonObject;return jsonObject;
}void electronicDictionary::on_leFrom_editingFinished()
{from = ui->leFrom->text();qDebug() << "from=" << from;
}void electronicDictionary::on_leTo_editingFinished()
{to = ui->leTo->text();qDebug() << "to=" << to;
}void electronicDictionary::on_pbSwitch_clicked()
{QString tmp = from;from = to;to = tmp;ui->leFrom->setText(from);ui->leTo->setText(to);qDebug() << "from=" << from << ":to=" << to;
}void electronicDictionary::md5Encryption()
{sign = appid+q+salt+key;qDebug() << "sign = " << sign;//md5加密//构造一个对象,该对象可根据指定method和之后添加的data,创建出加密散列。QCryptographicHash md(QCryptographicHash::Md5);md.addData(sign.toLatin1());signMd5 = "";//返回最后的散列值。//返回字节数组的十六进制编码副本。十六进制编码使用数字0-9和字母a-f。//将字节数组附加到此字符串。signMd5.append(md.result().toHex());ui->leMd5->setText(signMd5);qDebug() << "signMd5=" << signMd5;
}void electronicDictionary::urlEncode()
{QTextCodec *tc = QTextCodec::codecForName("UTF-8");Q_UNUSED(tc);QByteArray byteArrayUTF8 = tc->fromUnicode(q);q.clear();q =  QString(byteArrayUTF8.toPercentEncoding());qDebug() << "URL encode q=" << q;
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRandomGenerator>
#include <QCryptographicHash>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}
void Widget::on_leAppId_editingFinished()
{appid = ui->leAppId->text();qDebug() << "appid = " << appid;
}void Widget::on_leKey_editingFinished()
{key = ui->leKey->text();qDebug() << "key = " << key;
}void Widget::on_pbEncryption_clicked()
{if(salt.isEmpty()){quint32 randNumber = QRandomGenerator::global()->bounded(1073741825, 2147483648);//根据指定的基数返回与number相当的字符串salt = QString::number(randNumber,10);ui->leSalt->setText(salt);qDebug() << "randNumber=" << randNumber;}qDebug() << "salt=" << salt;dictionary = new electronicDictionary(0,appid,key,salt);dictionary->show();this->hide();
}void Widget::on_leSalt_editingFinished()
{salt = ui->leSalt->text();qDebug() << "salt=" << salt;
}

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

以上为整个项目粗略概述,有疑问或有意见、建议的恳请下方留言。

源码包地址:https://download.csdn.net/download/ezio_bel/11973260

优衣酱有时间再进行具体的阐述和改进,可能当作插叙放到下次博客中也可能放到下下次。

QT小项目-基于百度API的在线词典相关推荐

  1. PHP在线文字转语音合成源码 基于百度API开发

    介绍: PHP在线文字转语音合成源码 基于百度API开发 网盘下载地址: https://zijiewangpan.com/zCErg2PByjO 图片:

  2. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)

    之前已经介绍过,如何使用百度地图api来获取地理位置信息 微信小程序的百度地图获取地理位置 -- 微信小程序教程系列(15) 下面介绍使用百度api来获取天气信息. 1> 第一步:先到百度开放平 ...

  3. QT小项目--头脑风暴

    QT小项目--头脑风暴 项目演示: 客户端: 单人联网模式 双人匹配对战模式 单机本地练习模式 服务器 服务器主要功能 项目演示: 客户端: 登陆界面,有登陆功能和注册功能,当选择登陆时,如果无此账号 ...

  4. android 仿qq修改头像,Qt:小项目仿QQ修改头像界面,技术点记录

    最近写了一个修改头像功能的UI,布局参考了QQ目前的修改头像界面.如下图 这里主要说明一下两个地方的技术:1.头像图片上层的遮罩层,圆形外部为灰色,内部为全透明:2.上传图片宽高比例可以通过鼠标拖拽移 ...

  5. SpringBoot项目调用百度API 实现文本与图像审核功能

    SpringBoot项目调用百度API 实现文本与图像审核功能 最近在开发一款微信小程序,其中具有发布帖子的功能,因此需要审核发布的文本与图像(不然开发的微信小程序过不了审).本来是调用微信小程序的A ...

  6. java+js实现人脸识别-基于百度api

    java+js实现人脸识别-基于百度api 我的第一次分享 第一步-我们了解下实现的思路 代码部分:1.js代码 2.后台代码 3.如何使用百度大脑 4.如何使用 navigator.mediaDev ...

  7. qt小项目 代码实现简易的QQ聊天界面

    qt小项目 代码实现简易的QQ聊天界面 代码 效果图 总结 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QW ...

  8. Python:批量增强图片清晰度 ——基于百度API,含获取的AK、 SK的流程,access_token的获取流程,以及生成.exe文件

    Python:批量增强图片清晰度 --基于百度API,含获取的AK. SK的流程,access_token的获取流程,以及生成.exe文件 最近需要提高一些图片的清晰度,但一张张的去弄太费时间了,所以 ...

  9. 【微信小程序调用百度API实现图像识别功能】----项目实战

    本章主要讲述: 如何更快的上手小程序 如何搭建一个页面以及跳转到另一个页面 如何调用百度API接口实现图像识别技术 如何在微信小程序的后台添加合法域名 私信获取源码,有问题可以关注留言或私信,计算机毕 ...

  10. 项目:基于百度API智能语音家居控制系统

    目录 开发平台/开发环境: windows 10.Linux.arm cortex A9(Exynos 4412).ubuntu20.04.zigebee通信.摄像头外设.cortex-M0: 项目模 ...

最新文章

  1. 一种用于三维物体建模的精确、鲁棒的距离图像配准算法
  2. 《数据科学:R语言实现》——2.7 爬取网络数据
  3. Docker知识6:实战!将一个tensorflow项目制作成Docker image
  4. 在表空间有足够free space的情况下出现ORA-1652
  5. 学术之问2018-04-05
  6. js获取时间段内属于星期一的日期们
  7. VTK:量化多数据点用法实战
  8. Django2.2-LookupError No installed app with label admin
  9. 网页编程技术二(块级元素和行内标签)
  10. uvc能支持多大分辨率_华为手环B5测评:该有的功能一个不缺,甚至还能变身蓝牙耳机...
  11. 吴恩达机器学习作业(1)
  12. 一、Django初级
  13. vs2013 旗舰版 密钥
  14. 5星好书———电子技术基础数字部分(第6版)
  15. VBS命令:关于以管理员身份运行程序的VBS命令
  16. Redis解决高并发(秒杀抢红包)
  17. win10怎么调用计算机,win10如何打开电脑设置?win10打开电脑设置的方法
  18. Swift学习笔记 (四十二) 不透明类型
  19. 网页版微信和微信公共号扫码登陆原理分析
  20. 激励是改善业绩的关键

热门文章

  1. Eclipse的使用-Eclipse的简单使用,需要的来看看吧!
  2. 说好的弯曲损耗不敏感呢!入户皮线光缆的衰耗从何而来?
  3. Snapshot使用
  4. 根据银行账号判定所属银行
  5. 根据卡号识别银行卡类型
  6. 2022年第十二届MathorCup高校数学建模挑战赛
  7. 华硕笔记本linux触摸板驱动,华硕笔记本触摸板驱动安装教程及打开方法
  8. 敏感性分析数学建模方法(敏感性分析数学建模模型)
  9. pip下载安装包默认位置_修改pip 下载模块或软件的默认文件夹
  10. 妙招防止非法入侵Win2000/XP系统(转)