lilydict百合词典编译记录

简介: 本文记录了百合词典(lilydict)的编译过程,包括编译结果截图、代码研究(涉及类管理、浮窗显示、字典管理、qml加载和网络通信管理方式),以及相关参考链接。文章提供了详细的代码片段和解析,展示了如何使用Qt框架进行桌面应用开发。

一 编译结果

二 代码研究

2.1 全部类管理方式

enum class ShowType{
   balloon,main};
enum class DictType{
   ShanbayDict,YoudaoDict};
namespace DICT{
   
    extern std::unique_ptr<Gui> gui;
    extern std::unique_ptr<Application> app;
    extern std::unique_ptr<ShanbayDict> shanbayDict;
    extern std::unique_ptr<YoudaoDict> youdaoDict;
    extern std::unique_ptr<Config> 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<QWindow*>(engine->rootObjects().last());
        loginWin->setIcon(QIcon(":/img/logo.png"));

        //loginWin->setFlags(Qt::FramelessWindowHint);
        //qDebug()<<engine.rootObjects().size()<<loginWin->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()<<QString::fromUtf8(reply->readAll());
    }
    //qDebug()<<QString::fromUtf8(reply->readAll());
    //qDebug()<<"Http request finished!"<<reply->error()<<reply->errorString()<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()<<reply->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="<<sessionid<<replData;
        //if(sessionidOk()){
   
        this->state = NetState::login;
        html=QString::fromUtf8(replData);
        //qDebug()<<html;
        captcha.parseHtml(html);
        if(captcha.isneed()){
   
            emit signalShowCaptcha();
        }
        //}
        emit signalConnectFinished();
        break;
    case HttpAction::RefreshCaptchaImg:
        html=QString::fromUtf8(replData);
        //qDebug()<<html;
        //captcha.parseHtml(html);
        jsonDoc=QJsonDocument::fromJson(replData);
        if(!jsonDoc.isNull()){
   
            jsonObj=jsonDoc.object();
            jsonObj=jsonObj.value("data").toObject();
            captcha.id = jsonObj.value("key").toString();
            captcha.url = jsonObj.value("image_url").toString();
            emit signalShowCaptcha();
        }
        break;
    case HttpAction::LoginAction:
        httpAction=HttpAction::NoAction;
        html=QString::fromUtf8(replData);
        qDebug()<<html;
        jsonDoc=QJsonDocument::fromJson(replData);
        if(jsonDoc.isNull()){
   
            nickname=QUrl::fromPercentEncoding(getCookie("username").toLatin1());
            qDebug()<<"Login OK!nickname="<<nickname;
            state=NetState::ok;
            emit signalLoginFinished(true,"登录成功");
        }else{
   
            jsonObj = jsonDoc.object();
            if(jsonObj.value("status_code").toInt()==0){
   
                emit signalLoginFinished(true,"登录成功");
            }else{
   
                refreshCaptchaImg();
            }

            //            qDebug()<<"Login failed!";
            //            //qDebug()<<html<<"验证码错误 pos:"<<html.indexOf("验证码错误");
            //            captcha.parseHtml(html);
            //            if(captcha.isneed()){
   
            //                emit signalShowCaptcha();
            //            }
            //            if(html.indexOf("请输入正确的用户名或注册邮箱和密码")>-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="<br>";
        //            for(auto it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++){
   
        //                //qDebug()<<it.key()<<it.value();
        //                DICT::word->en_definitions+=QString("<br><font color='black'><b>%1. </b></font>").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+="<br>";

        //            }
        //                        qDebug()<<QString("wordname=%1,learning_id=%2,definition=%3,pron=[%4],audio=%5,en_definition=%6")
        //                                  .arg(DICT::word->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()<<DICT::word->learning_id;
        //            if(DICT::word->learning_id!="0"){
   
        //                queryExamples(DICT::word->learning_id);
        //            }

        //            //qDebug()<<jsonObj.value("voc").toMap().value("definition").toString();
        //            //qDebug()<<jsondata;
        //        }
        break;
    case HttpAction::AddExampleAction:
        //qDebug()<<QString::fromUtf8(reply->readAll());
        // jsondata=jsonParser->parse(reply->readAll(),&jsonok);
        jsonDoc=QJsonDocument::fromJson(replData);
        if(!jsonDoc.isNull()){
   
            jsonObj=jsonDoc.object();
            //qDebug()<<"example_status"<<jsonObj.value("example_status").toString();
            double examplestatus=jsonObj.value("example_status").toDouble();
            if(examplestatus==1){
   
                emit signalAddExampleFinished("例句添加成功");
            }else if(examplestatus==0){
   
                emit signalAddExampleFinished("例句添加失败,例句或翻译不能为空");

            }else if(examplestatus==100){
   
                emit signalAddExampleFinished("例句添加失败,例句未包含指定原词,或者它的有效变体");

            }else if(examplestatus==300){
   
                emit signalAddExampleFinished("例句添加失败,例句及其译文总长超过300个字符");
            }else{
   
                emit signalAddExampleFinished("例句添加失败,指定词汇学习记录实例不存在,或者用户无权查看其内容");
            }
        }else{
   
            emit signalAddExampleFinished("例句添加失败");
        }
        break;
    case HttpAction::QueryWordExamplesAction:
        qDebug()<<"query word examples";
        jsonDoc=QJsonDocument::fromJson(replData);
        if(!jsonDoc.isNull()){
   
            jsonObj=jsonDoc.object();
            if(jsonObj.value("examples_status").toDouble()==1){
   
                foreach(QJsonValue jv,jsonObj.value("examples").toArray()){
   
                    //DICT::word->examples.append(jv.toObject());
                }

                //                auto exmList=jsonObj.value("examples").toList();
                //                for(int i=0;i<exmList.size();i++){
   
                //                    exmObj=exmList.at(i);
                //                    DICT::word->examples.append(exmObj);
                //                    qDebug()<<exmObj.value("first").toString()+exmObj.value("mid").toString()+exmObj.value("last").toString();
                //                    qDebug()<<exmObj.value("translation").toString();
                //                }
                emit signalQueryExampleFinished();
            }

        }
        break;
    case HttpAction::AddWordAction:
        emit signalAddwordFinished(QString::fromUtf8(replData));
        //qDebug()<<"add word_____________"<<QString::fromUtf8(reply->readAll());


        //        jsonDoc=QJsonDocument::fromJson(replData);
        //        if(!jsonDoc.isNull()){
   
        //            jsonObj=jsonDoc.object();
        //            //qDebug()<<"jsonObj"<<jsonObj;
        //            DICT::word->learning_id=QString::number(jsonObj.value("id").toDouble(),'g',15);
        //            qDebug()<<jsonObj.value("id").toDouble()<<"add word result learning id="<<DICT::word->learning_id<< (DICT::word->learning_id!="0");
        //            emit signalAddwordFinished(DICT::word->learning_id!="0");
        //            queryExamples(DICT::word->learning_id);
        //        }
        //qDebug()<<QString::fromUtf8(reply->readAll());
        break;
    default:
        //        qDebug()<<reply->rawHeader("Content-Encoding");//gzip
        //        qDebug()<<QString::fromUtf8(reply->readAll());
        break;

    }

}

三 参考链接

lilydict: 百合词典,是一个开源跨平台桌面版词典软件,使用C++开发,图形界面框架库Qt5 QML。 (gitee.com)

(23条消息) Qt高质量的开源项目合集_不熬夜的( ⊙ o ⊙ )猫的博客-CSDN博客_qt项目源码

Github上的一些高分Qt开源项目 - 简书 (jianshu.com)

相关文章
|
11天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
8天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2522 18
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
8天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1525 15
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
4天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
10天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
593 14
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19283 30
|
10天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
492 49
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18842 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17530 13
Apache Paimon V0.9最新进展
|
3天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
367 4
叮咚!您有一份六大必做安全操作清单,请查收