#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
//#define MY_APID 20190930000338348
//#define MY_APID_KEY "haynzrywFQvJHuFYXRaJ"
#define MY_APID 20210805000907975
#define MY_APID_KEY "4nYsiVhc4lHQCAfmPCuv"
#pragma execution_character_set("utf-8")
const QString tagMessage("message");
const QString tagTranslation("translation");
const QString tagSource("source");
struct sTimeout
{
QTime time;
uint32_t interval;
void start(uint32_t t)
{
interval = t;
time.start();
};
bool isTimeOut()
{
return time.elapsed() > interval;
};
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
, m_strFrom("zh")
, m_strTo("en")
, m_strOpenFile("")
, m_bTranslateAll(false)
, m_bTranslateStart(false)
, m_nCurrentHashIndex(0)
, m_nModelStep(0)
, m_nOneStep(0)
, m_nAllStep(0)
{
ui->setupUi(this);
this->setWindowIcon(QIcon(":/Resource/main.png"));
this->setWindowTitle(tr("在线翻译小工具(v1.0)"));
// 动态检测网络状态线程
m_pNetworkDetectionThread = new CNetworkDetectionThread();
// 启动线程
if(m_pNetworkDetectionThread)
m_pNetworkDetectionThread->start();
m_pManager = new QNetworkAccessManager(this);
if (m_pManager)
connect(m_pManager, &QNetworkAccessManager::finished, this, &Widget::slotReplyFinished);
initForm();
signalSlotDefine();
m_timer.start(100);
}
Widget::~Widget()
{
if (m_pNetworkDetectionThread)
{
delete m_pNetworkDetectionThread;
m_pNetworkDetectionThread = NULL;
}
delete ui;
}
// 初始化窗体
void Widget::initForm()
{
QTableWidget *table = ui->tableWidget;
QStringList strHeaderList;
strHeaderList << QObject::tr("源文") << QObject::tr("译文");
table->setColumnCount(strHeaderList.size());
table->setHorizontalHeaderLabels(strHeaderList);
table->verticalHeader()->setMinimumWidth(30);
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
table->horizontalHeader()->setStretchLastSection(true);
table->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
table->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
table->setSelectionMode(QAbstractItemView::SingleSelection);
ui->progressBar->setValue(0);
ui->comboBoxSrc->addItem(tr("zh|中文"));
ui->comboBoxSrc->addItem(tr("en|英文"));
ui->comboBoxSrc->addItem(tr("spa|西班牙语"));
ui->comboBoxSrc->addItem(tr("pt|葡萄牙语"));
ui->comboBoxSrc->addItem(tr("jp|日语"));
ui->comboBoxSrc->addItem(tr("kor|韩语"));
ui->comboBoxTag->addItem(tr("en|英文"));
ui->comboBoxTag->addItem(tr("spa|西班牙语"));
ui->comboBoxTag->addItem(tr("zh|中文"));
ui->comboBoxTag->addItem(tr("pt|葡萄牙语"));
ui->comboBoxTag->addItem(tr("jp|日语"));
ui->comboBoxTag->addItem(tr("kor|韩语"));
}
// 信号槽连接
void Widget::signalSlotDefine()
{
connect(ui->btnOpen,&QPushButton::clicked,this,&Widget::slotOpenFile);
connect(ui->btnSave, &QPushButton::clicked, this, &Widget::slotSaveFile);
connect(ui->btnTranslateCurrent, &QPushButton::clicked, this, &Widget::slotTranslateCurrent);
connect(ui->btnTranslateAll, &QPushButton::clicked, this, &Widget::slotTranslateAll);
connect(&m_timer, &QTimer::timeout, this, &Widget::slotOnTime);
connect(ui->comboBoxSrc, SIGNAL(currentTextChanged(const QString&)), this, SLOT(slotFromChange(const QString&)));
connect(ui->comboBoxTag, SIGNAL(currentTextChanged(const QString&)), this, SLOT(slotToChange(const QString&)));
connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(slotTablewidgetCellChanged(int,int)));
}
// 源语种下拉框改变
void Widget::slotFromChange(const QString strText)
{
if (strText.isEmpty())
return;
QStringList strList = strText.split("|");
if (strList.size() == 2)
m_strFrom = strList.at(0);
}
// 译语种下拉框改变
void Widget::slotToChange(const QString strText)
{
if (strText.isEmpty())
return;
QStringList strList = strText.split("|");
if (strList.size() == 2)
m_strTo = strList.at(0);
}
// 单元项编辑事件
void Widget::slotTablewidgetCellChanged(int nRow, int nColumn)
{
if (nRow < 0 || nColumn < 0)
return;
auto pItem = ui->tableWidget->item(nRow, nColumn);
if (pItem == nullptr)
return;
auto keys = m_ScrTranHash.keys();
m_ScrTranHash[keys[nRow]] = pItem->text();
}
// 上传译文
int Widget::slotUploadData(QString strSource)
{
strSource = strSource.replace("#", "");
strSource = strSource.replace("_", "");
strSource = strSource.replace("%", "");
strSource = strSource.replace("$", "");
strSource = strSource.replace("&", "");
strSource = strSource.replace("*", "");
strSource = strSource.replace("~", "");
QString strMD5;
char chSalt[1024];
// 获取随机数
sprintf(chSalt,"%d",rand());
// 连接加密文件
QString strSign=QString("%1%2%3%4").arg(MY_APID).arg(strSource).arg(chSalt).arg(MY_APID_KEY);
// 生成md5加密文件
QByteArray strTemp = QCryptographicHash::hash(strSign.toUtf8(),QCryptographicHash::Md5);
strMD5.append(strTemp.toHex());
// 连接上传文本
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(strSource).arg(m_strFrom).arg(m_strTo).arg(MY_APID).arg(chSalt).arg(strMD5);
// 发送上传
m_pManager->get(QNetworkRequest(QUrl(myurl)));
return 1;
}
// 收到翻译结果
int Widget::slotReplyFinished(QNetworkReply *reply)
{
QJsonParseError jsonError;
QByteArray all=reply->readAll();
QJsonDocument json = QJsonDocument::fromJson(all, &jsonError);
QJsonObject object = json.object();
qDebug() << QString::fromStdString(json.toJson().toStdString())<< "\n";
QString strResult("");
QString strSource("");
if(object.contains("error_code"))
{
int nResult=object.value("error_code").toInt();;
switch (nResult)
{
case 52001:strResult = tr("52001 请求超时 重试"); break;
case 52002:strResult = tr("52002 系统错误 重试");break;
case 54000:strResult = tr("54000 必填参数为空"); break;
case 54001:strResult = tr("54001 签名错误"); break;
case 54003:strResult = tr("54003 速度过快访问频率受限"); break;
case 54004:strResult = tr("54004 账户余额不足");break;
case 54005:strResult = tr("54005 请求频繁"); break;
case 58002:strResult = tr("58002 服务关闭");break;
default:strResult = tr("其他错误");break;
}
}
else
{
QJsonArray value = object.value("trans_result").toArray();
QJsonObject object1=value.at(0).toObject();
strResult=object1.value("dst").toString();
strSource = object1.value("src").toString();
}
//strResult = strResult.replace("(QQ)","#");
//strResult = strResult.replace("(WW)", "_");
//strResult = strResult.replace("(EE)", "%");
if (m_nModelStep == Tran_All)
{
auto keys = m_ScrTranHash.keys();
if (m_nCurrentHashIndex < keys.size())
{
m_ScrTranHash[keys.at(m_nCurrentHashIndex)] = strResult;
auto table = ui->tableWidget;
table->setItem(m_nCurrentHashIndex, 1, new QTableWidgetItem(strResult));
table->item(m_nCurrentHashIndex, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
}
}
else if (m_nModelStep == Tran_One)
{
auto keys = m_ScrTranHash.keys();
int nRow = ui->tableWidget->currentRow();
if (nRow < keys.size() && nRow >= 0)
{
m_ScrTranHash[keys.at(nRow)] = strResult;
auto table = ui->tableWidget;
table->setItem(nRow, 1, new QTableWidgetItem(strResult));
table->item(nRow, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
}
}
m_bTranslateStart = false;
reply->delete

sding
- 粉丝: 119
最新资源
- 单片机教室照明控制系统的设计与实现.docx
- 对抗训练与多模态特征融合的情感识别算法优化研究.docx
- 电气自动化与人工智能融合的现状、趋势与展望.docx
- 电动振动台非线性控制算法优化及前馈控制技术研究.docx
- 分析人工智能技术可能带来的社会风险及其治理机制.docx
- 服务器维保服务规划与实施策略研究.docx
- 多目标优化算法在农业种植结构中的应用.docx
- 改进ESMDO算法在PMSM双惯量系统无模型滑模控制中的应用研究.docx
- 改进YOLOv5n算法与仿生海豚模型在目标识别跟踪中的应用.docx
- 复合窗幕系统建筑能耗模拟:DesignBuilder软件参数化建模与验证.docx
- 高校美育的人工智能赋能:机遇与挑战分析.docx
- 国产大模型舆情演化模拟:基于LLM增强的主题建模.docx
- 海上风电基础冲刷深度预测模型构建及机器学习算法应用.docx
- 高保密软件开发项目信息资产的分类分级管理与全生命周期控制研究.docx
- 互联网技术支持下高校课堂参与度提升路径研究.docx
- 互联网直播虚假宣传的法律监管与治理策略研究.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论0