目录
一 编译结果
二 代码研究
2.1 全部类管理方式
2.2 浮窗显示管理方式
2.3 字典管理方式
2.4 qml加载方式
2.5 网络通信管理方式
三 参考链接
一 编译结果
二 代码研究
2.1 全部类管理方式
enum class ShowType{balloon,main};
enum class DictType{ShanbayDict,YoudaoDict};
namespace DICT{
extern std::unique_ptr gui;
extern std::unique_ptr app;
extern std::unique_ptr shanbayDict;
extern std::unique_ptr youdaoDict;
extern std::unique_ptr cfg;
extern Dictlogo* logo;
extern ShowType showType;
void init();
void queryWord(const QString& word);
void showWord(DictType dictType,const QString& wordinfo);
}
2.2 浮窗显示管理方式
void Application::run(){
DICT::init();
if(DICT::cfg->isStartloginshanbay()){
DICT::gui->showLoginWin();
}else{
if(!DICT::cfg->isAutohide()){
DICT::gui->showMainWin();
}
}
}
2.3 字典管理方式
QObject::connect(DICT::cfg.get(),&Config::signalChange,
[&](const QString& key, const QVariant& value){
if(key=="screentext"){
getscreenwordAction->setChecked(value.toBool());
}else if(key=="autospeak"){
autospeakAction->setChecked(value.toBool());
setScreenText();
}else if(key=="selectedtext"){
setScreenText();
}else if(key=="clipboardtext"){
setScreenText();
}
});
2.4 qml加载方式
//loginWin
void Gui::showLoginWin(){
qDebug()<<"show loginwin";
if(loginWin==nullptr){
qDebug()<<"load loginwin";
engine->load(QUrl(QStringLiteral("qrc:/qml/Login.qml")));
loginWin = qobject_cast(engine->rootObjects().last());
loginWin->setIcon(QIcon(":/img/logo.png"));
//loginWin->setFlags(Qt::FramelessWindowHint);
//qDebug()<objectName();
QObject::connect(loginWin,SIGNAL(signalRegisterClick()),
this,SLOT(registerClick()));
QObject::connect(loginWin, SIGNAL(signalLoginClick(QString,QString,QString)),
this, SIGNAL(signalLoginClick(QString,QString,QString)));
QObject::connect(loginWin,SIGNAL(signalFreshCaptchaImg()),
this,SIGNAL(signalFreshCaptchaImg()));
QObject::connect(this,SIGNAL(signalShowCaptchaImg(QVariant)),
loginWin,SLOT(showCaptchaImg(QVariant)));
QObject::connect(this,SIGNAL(signalSetLoginWinState(QVariant)),
loginWin,SLOT(setState(QVariant)));
}
loginWin->show();
}
2.5 网络通信管理方式
void ShanbayDict::httpfinished(QNetworkReply* reply){
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString().isEmpty()){
qDebug()<readAll());
}
//qDebug()<readAll());
//qDebug()<<"Http request finished!"<error()<errorString()<attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()<url();
QJsonDocument jsonDoc;
QJsonObject jsonObj,vocObj,en_definitionsObj;
QString html;
QByteArray replData=reply->readAll();
sessionid=getCookie("csrftoken");
switch(httpAction){
case HttpAction::NoAction:
break;
case HttpAction::GetSessionidAction:
//sessionid=getCookie("csrftoken");//sessionid已经不在使用
//qDebug()<<"sessionid="<state = NetState::login;
html=QString::fromUtf8(replData);
//qDebug()<-1){
// emit signalLoginFinished(false,"请输入正确的用户名或注册邮箱和密码");
// }else{
// emit signalLoginFinished(false,"验证码错误");
// }
}
break;
case HttpAction::QueryWordAction:
//qDebug()<<"query word";
//jsondata=jsonParser->parse(reply->readAll(),&jsonok);
//jsonDoc=QJsonDocument::fromJson(replData);
emit signalRetWordinfo(QString::fromUtf8(replData));
// if(!jsonDoc.isNull()){
// // jsonObj=jsondata.toMap();
// jsonObj=jsonDoc.object();
// vocObj=jsonObj.value("voc").toObject();
// en_definitionsObj=vocObj.value("en_definitions").toObject();
// DICT::word->clear();
// DICT::word->name=vocObj.value("content").toString();
// DICT::word->learning_id=QString::number(jsonObj.value("learning_id").toDouble(),'g',15);
// DICT::word->definition=vocObj.value("definition").toString();
// DICT::word->pron=vocObj.value("pron").toString();
// DICT::word->audio=vocObj.value("audio").toString();
// //DICT::word->en_definitions="
";
// for(auto it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++){
// //qDebug()<en_definitions+=QString("
%1. ").arg(it.key());
// if(it.value().isArray()){
// foreach(QJsonValue jv,it.value().toArray()){
// DICT::word->en_definitions+=QString("%1; ").arg(jv.toString());
// }
// }
// DICT::word->en_definitions+="
";
// }
// qDebug()<name)
// .arg(DICT::word->learning_id)
// .arg(DICT::word->definition)
// .arg(DICT::word->pron)
// .arg(DICT::word->audio)
// .arg(DICT::word->en_definitions);
// emit signalQueryFinished();
// //qDebug()<learning_id;
// if(DICT::word->learning_id!="0"){
// queryExamples(DICT::word->learning_id);
// }
// //qDebug()<readAll());
// jsondata=jsonParser->parse(reply->readAll(),&jsonok);
jsonDoc=QJsonDocument::fromJson(replData);
if(!jsonDoc.isNull()){
jsonObj=jsonDoc.object();
//qDebug()<<"example_status"<examples.append(jv.toObject());
}
// auto exmList=jsonObj.value("examples").toList();
// for(int i=0;iexamples.append(exmObj);
// qDebug()<readAll());
// jsonDoc=QJsonDocument::fromJson(replData);
// if(!jsonDoc.isNull()){
// jsonObj=jsonDoc.object();
// //qDebug()<<"jsonObj"<learning_id=QString::number(jsonObj.value("id").toDouble(),'g',15);
// qDebug()<learning_id!="0");
// queryExamples(DICT::word->learning_id);
// }
//qDebug()<readAll());
break;
default:
// qDebug()<rawHeader("Content-Encoding");//gzip
// qDebug()<readAll());
break;
}
}
void Application::run(){
DICT::init();
if(DICT::cfg->isStartloginshanbay()){
DICT::gui->showLoginWin();
}else{
if(!DICT::cfg->isAutohide()){
DICT::gui->showMainWin();
}
}
}
2.3 字典管理方式
QObject::connect(DICT::cfg.get(),&Config::signalChange,
[&](const QString& key, const QVariant& value){
if(key=="screentext"){
getscreenwordAction->setChecked(value.toBool());
}else if(key=="autospeak"){
autospeakAction->setChecked(value.toBool());
setScreenText();
}else if(key=="selectedtext"){
setScreenText();
}else if(key=="clipboardtext"){
setScreenText();
}
});
2.4 qml加载方式
//loginWin
void Gui::showLoginWin(){
qDebug()<<"show loginwin";
if(loginWin==nullptr){
qDebug()<<"load loginwin";
engine->load(QUrl(QStringLiteral("qrc:/qml/Login.qml")));
loginWin = qobject_cast(engine->rootObjects().last());
loginWin->setIcon(QIcon(":/img/logo.png"));
//loginWin->setFlags(Qt::FramelessWindowHint);
//qDebug()<objectName();
QObject::connect(loginWin,SIGNAL(signalRegisterClick()),
this,SLOT(registerClick()));
QObject::connect(loginWin, SIGNAL(signalLoginClick(QString,QString,QString)),
this, SIGNAL(signalLoginClick(QString,QString,QString)));
QObject::connect(loginWin,SIGNAL(signalFreshCaptchaImg()),
this,SIGNAL(signalFreshCaptchaImg()));
QObject::connect(this,SIGNAL(signalShowCaptchaImg(QVariant)),
loginWin,SLOT(showCaptchaImg(QVariant)));
QObject::connect(this,SIGNAL(signalSetLoginWinState(QVariant)),
loginWin,SLOT(setState(QVariant)));
}
loginWin->show();
}
2.5 网络通信管理方式
void ShanbayDict::httpfinished(QNetworkReply* reply){
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString().isEmpty()){
qDebug()<readAll());
}
//qDebug()<readAll());
//qDebug()<<"Http request finished!"<error()<errorString()<attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()<url();
QJsonDocument jsonDoc;
QJsonObject jsonObj,vocObj,en_definitionsObj;
QString html;
QByteArray replData=reply->readAll();
sessionid=getCookie("csrftoken");
switch(httpAction){
case HttpAction::NoAction:
break;
case HttpAction::GetSessionidAction:
//sessionid=getCookie("csrftoken");//sessionid已经不在使用
//qDebug()<<"sessionid="<state = NetState::login;
html=QString::fromUtf8(replData);
//qDebug()<-1){
// emit signalLoginFinished(false,"请输入正确的用户名或注册邮箱和密码");
// }else{
// emit signalLoginFinished(false,"验证码错误");
// }
}
break;
case HttpAction::QueryWordAction:
//qDebug()<<"query word";
//jsondata=jsonParser->parse(reply->readAll(),&jsonok);
//jsonDoc=QJsonDocument::fromJson(replData);
emit signalRetWordinfo(QString::fromUtf8(replData));
// if(!jsonDoc.isNull()){
// // jsonObj=jsondata.toMap();
// jsonObj=jsonDoc.object();
// vocObj=jsonObj.value("voc").toObject();
// en_definitionsObj=vocObj.value("en_definitions").toObject();
// DICT::word->clear();
// DICT::word->name=vocObj.value("content").toString();
// DICT::word->learning_id=QString::number(jsonObj.value("learning_id").toDouble(),'g',15);
// DICT::word->definition=vocObj.value("definition").toString();
// DICT::word->pron=vocObj.value("pron").toString();
// DICT::word->audio=vocObj.value("audio").toString();
// //DICT::word->en_definitions="
";
// for(auto it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++){
// //qDebug()<en_definitions+=QString("
%1. ").arg(it.key());
// if(it.value().isArray()){
// foreach(QJsonValue jv,it.value().toArray()){
// DICT::word->en_definitions+=QString("%1; ").arg(jv.toString());
// }
// }
// DICT::word->en_definitions+="
";
// }
// qDebug()<name)
// .arg(DICT::word->learning_id)
// .arg(DICT::word->definition)
// .arg(DICT::word->pron)
// .arg(DICT::word->audio)
// .arg(DICT::word->en_definitions);
// emit signalQueryFinished();
// //qDebug()<learning_id;
// if(DICT::word->learning_id!="0"){
// queryExamples(DICT::word->learning_id);
// }
// //qDebug()<readAll());
// jsondata=jsonParser->parse(reply->readAll(),&jsonok);
jsonDoc=QJsonDocument::fromJson(replData);
if(!jsonDoc.isNull()){
jsonObj=jsonDoc.object();
//qDebug()<<"example_status"<examples.append(jv.toObject());
}
// auto exmList=jsonObj.value("examples").toList();
// for(int i=0;iexamples.append(exmObj);
// qDebug()<readAll());
// jsonDoc=QJsonDocument::fromJson(replData);
// if(!jsonDoc.isNull()){
// jsonObj=jsonDoc.object();
// //qDebug()<<"jsonObj"<learning_id=QString::number(jsonObj.value("id").toDouble(),'g',15);
// qDebug()<learning_id!="0");
// queryExamples(DICT::word->learning_id);
// }
//qDebug()<readAll());
break;
default:
// qDebug()<rawHeader("Content-Encoding");//gzip
// qDebug()<readAll());
break;
}
}
//loginWin
void Gui::showLoginWin(){
qDebug()<<"show loginwin";
if(loginWin==nullptr){
qDebug()<<"load loginwin";
engine->load(QUrl(QStringLiteral("qrc:/qml/Login.qml")));
loginWin = qobject_cast(engine->rootObjects().last());
loginWin->setIcon(QIcon(":/img/logo.png"));
//loginWin->setFlags(Qt::FramelessWindowHint);
//qDebug()<objectName();
QObject::connect(loginWin,SIGNAL(signalRegisterClick()),
this,SLOT(registerClick()));
QObject::connect(loginWin, SIGNAL(signalLoginClick(QString,QString,QString)),
this, SIGNAL(signalLoginClick(QString,QString,QString)));
QObject::connect(loginWin,SIGNAL(signalFreshCaptchaImg()),
this,SIGNAL(signalFreshCaptchaImg()));
QObject::connect(this,SIGNAL(signalShowCaptchaImg(QVariant)),
loginWin,SLOT(showCaptchaImg(QVariant)));
QObject::connect(this,SIGNAL(signalSetLoginWinState(QVariant)),
loginWin,SLOT(setState(QVariant)));
}
loginWin->show();
}
2.5 网络通信管理方式
void ShanbayDict::httpfinished(QNetworkReply* reply){
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString().isEmpty()){
qDebug()<readAll());
}
//qDebug()<readAll());
//qDebug()<<"Http request finished!"<error()<errorString()<attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()<url();
QJsonDocument jsonDoc;
QJsonObject jsonObj,vocObj,en_definitionsObj;
QString html;
QByteArray replData=reply->readAll();
sessionid=getCookie("csrftoken");
switch(httpAction){
case HttpAction::NoAction:
break;
case HttpAction::GetSessionidAction:
//sessionid=getCookie("csrftoken");//sessionid已经不在使用
//qDebug()<<"sessionid="<state = NetState::login;
html=QString::fromUtf8(replData);
//qDebug()<-1){
// emit signalLoginFinished(false,"请输入正确的用户名或注册邮箱和密码");
// }else{
// emit signalLoginFinished(false,"验证码错误");
// }
}
break;
case HttpAction::QueryWordAction:
//qDebug()<<"query word";
//jsondata=jsonParser->parse(reply->readAll(),&jsonok);
//jsonDoc=QJsonDocument::fromJson(replData);
emit signalRetWordinfo(QString::fromUtf8(replData));
// if(!jsonDoc.isNull()){
// // jsonObj=jsondata.toMap();
// jsonObj=jsonDoc.object();
// vocObj=jsonObj.value("voc").toObject();
// en_definitionsObj=vocObj.value("en_definitions").toObject();
// DICT::word->clear();
// DICT::word->name=vocObj.value("content").toString();
// DICT::word->learning_id=QString::number(jsonObj.value("learning_id").toDouble(),'g',15);
// DICT::word->definition=vocObj.value("definition").toString();
// DICT::word->pron=vocObj.value("pron").toString();
// DICT::word->audio=vocObj.value("audio").toString();
// //DICT::word->en_definitions="
";
// for(auto it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++){
// //qDebug()<en_definitions+=QString("
%1. ").arg(it.key());
// if(it.value().isArray()){
// foreach(QJsonValue jv,it.value().toArray()){
// DICT::word->en_definitions+=QString("%1; ").arg(jv.toString());
// }
// }
// DICT::word->en_definitions+="
";
// }
// qDebug()<name)
// .arg(DICT::word->learning_id)
// .arg(DICT::word->definition)
// .arg(DICT::word->pron)
// .arg(DICT::word->audio)
// .arg(DICT::word->en_definitions);
// emit signalQueryFinished();
// //qDebug()<learning_id;
// if(DICT::word->learning_id!="0"){
// queryExamples(DICT::word->learning_id);
// }
// //qDebug()<readAll());
// jsondata=jsonParser->parse(reply->readAll(),&jsonok);
jsonDoc=QJsonDocument::fromJson(replData);
if(!jsonDoc.isNull()){
jsonObj=jsonDoc.object();
//qDebug()<<"example_status"<examples.append(jv.toObject());
}
// auto exmList=jsonObj.value("examples").toList();
// for(int i=0;iexamples.append(exmObj);
// qDebug()<readAll());
// jsonDoc=QJsonDocument::fromJson(replData);
// if(!jsonDoc.isNull()){
// jsonObj=jsonDoc.object();
// //qDebug()<<"jsonObj"<learning_id=QString::number(jsonObj.value("id").toDouble(),'g',15);
// qDebug()<learning_id!="0");
// queryExamples(DICT::word->learning_id);
// }
//qDebug()<readAll());
break;
default:
// qDebug()<rawHeader("Content-Encoding");//gzip
// qDebug()<readAll());
break;
}
}
"; // for(auto it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++){ // //qDebug()<
%1. ").arg(it.key()); // if(it.value().isArray()){ // foreach(QJsonValue jv,it.value().toArray()){ // DICT::word->en_definitions+=QString("%1; ").arg(jv.toString()); // } // } // DICT::word->en_definitions+="
"; // } // qDebug()<
三 参考链接
lilydict: 百合词典,是一个开源跨平台桌面版词典软件,使用C++开发,图形界面框架库Qt5 QML。 (gitee.com)
(23条消息) Qt高质量的开源项目合集_不熬夜的( ⊙ o ⊙ )猫的博客-CSDN博客_qt项目源码
Github上的一些高分Qt开源项目 - 简书 (jianshu.com)



