服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于QT设计一个春联自动生成器

基于QT设计一个春联自动生成器

2022-09-07 15:25DS小龙哥 C/C++

春节是中国最隆重的传统节日,一到过年家家户户肯定是要贴春联;在春节前夕,会用大红纸张,加上浓墨书写祝福词语。本文将利用Qt框架设计一个春联自动生成器,需要的可以参考一下

1. 前言

春节是中国最隆重的传统节日,一到过年家家户户肯定是要贴春联;在春节前夕,会用大红纸张,加上浓墨书写祝福词语,在春节当天贴于门框两边,寓意着一年吉祥如意,还会将福字倒转贴于门上,有"福到临门"的意思。为了方便找到合适的春联句子,我这里就采用现成的自然语言处理接口实现了一个自动生成春联的软件,输入提示词就可以完成春联的生成,方便写春联时参考。

下面是实现的效果:

基于QT设计一个春联自动生成器

基于QT设计一个春联自动生成器

基于QT设计一个春联自动生成器

小时候最期盼的日子就是过年,可以穿新衣服,吃平时吃不到的好吃的,吃完年夜饭一起看春晚,放鞭炮;现在生活水平逐渐提高,平时穿的吃的也不差,也没有很期待了,现在过年吃完饭大家都是盯着手机玩,感觉没有以前小时候那种感觉了。

 

2. 实现原理

软件是采用Qt框架设计,调用百度大脑的智能春联接口完成春联生成。

官网地址: https://ai.baidu.com/tech/nlp_apply

基于QT设计一个春联自动生成器

HTTP请求方法: POST

请求地址:  https://aip.baidubce.com/rpc/2.0/creation/v1/couplets

URL的参数:access_token 通过API Key和Secret Key获取的access_token

请求头Header:Content-Type  application/json​

请求参数

text    春联主题的提示字符

index   春联的索引. 默认是0,同一个提示符,多次获取时,这个索引+1就能访问后面的春联.​

返回参数解释

first   春联上联:成7-9个字的上联

second  春联下联:生成7-9个字的春联下联

center  春联横批:生成4个字的春联横批

请求示例:

{ 
"text": "新水",
"index": 0
}

返回的数据示例:

{   
    "couplets" : {
       "first":  "新春新水千山绿",
       "second": "春色春风万户红",
       "center": "喜迎新春"
    }
}

 

3. 示例代码

下面列出主要的核心代码,可以直接贴到自己工程里就可以使用。

 

3.1 获取春联接口

//获取春联
void Widget::get_CoupletText(QString terms,int index)
{
    function_select=1;
    QString requestUrl;
    QNetworkRequest request;
​
    //存放图片BASE64编码
    QString imgData;
​
    //打包请求参数赋值
    QJsonObject post_data;
    QJsonDocument document;
​
    //设置请求地址
    QUrl url;
    QByteArray post_param;
​
    //请求地址
    requestUrl = "https://aip.baidubce.com/rpc/2.0/creation/v1/couplets";
​
    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
​
    //设置请求参数:
    post_data.insert("text",terms); //字符串(限5字符数以内)即春联的主题
    post_data.insert("index",index);  //int 整数 默认为数值为0,即第一幅春联。每换一次,数值加1即可,一定数量后会返回之前的春联结果。
​
    //构造请求
    url.setUrl(requestUrl + "?access_token=" + Token);
    request.setUrl(url);
​
    document.setObject(post_data);
    post_param = document.toJson(QJsonDocument::Compact);
​
    //发送请求
    manager->post(request, post_param);
}

 

3.2 数据解析代码

//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
​
    //读取所有数据
    QByteArray replyData = reply->readAll();
​
    qDebug()<<"状态码:"<<statusCode;
    qDebug()<<"反馈的数据:"<<QString(replyData);
​
    //判断状态码
    if(200 != statusCode)
    {
        return;
    }
​
    /*
反馈的数据: "{"couplets":{"center":"万象皆春","first":"龙年龙舞千秋业","second":"蛇岁蛇腾万里春"},"log_id":1484407725829006888}"
​
上联: "龙年龙舞千秋业"
下联: "蛇岁蛇腾万里春"
横批: "万象皆春"
​
上联: "虎跃龙腾千里虎"
下联: "龙腾虎跃万家龙"
横批: "虎跃龙腾"
​
*/
    if(function_select==1) //春联生成
    {
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            {
                QJsonObject obj = document.object();
                //解析错误代码
                if(obj.contains("error_code"))
                {
                    int error_code=obj.take("error_code").toInt();
                    switch (error_code)
                    {
                    case 0: //成功
                        break;
                    case 110:
                    case 111:
                        QMessageBox::information(this,"提示","正在更新密匙.确定后重试.",
                        QMessageBox::Ok,QMessageBox::Ok);
​
                        //更新密匙
                        QTimer::singleShot(200, this, SLOT(updateCaption()));
                        return;
​
                    default:
                        if(obj.contains("error_msg"))
                        {
                            QString text=obj.take("error_msg").toString();
                            QMessageBox::information(this,"提示",text,
                            QMessageBox::Ok,QMessageBox::Ok);
                            return;
                        }
                    }
                }
                else if(obj.contains("couplets"))
                {
                    QJsonObject obj2=obj.take("couplets").toObject();
​
                    QString center; //横批
                    QString first;  //上联-第一
                    QString second; //下联第二
​
                    if(obj2.contains("center"))
                    {
                        center=obj2.take("center").toString();
                    }
                    if(obj2.contains("first"))
                    {
                        first=obj2.take("first").toString();
                    }
                    if(obj2.contains("second"))
                    {
                        second=obj2.take("second").toString();
                    }
​
                    ui->label_0->setText(center);
​
                    QString first_1="
";
                    for(int i=0;i<first.size();i++)
                    {
                        first_1+=first.at(i);
                        first_1+="
";
                    }
​
                    QString second_1="
";
                    for(int i=0;i<second.size();i++)
                    {
                        second_1+=second.at(i);
                        second_1+="
";
                    }
​
                    ui->label_1->setText(first_1);
                    ui->label_2->setText(second_1);
​
                    qDebug()<<"上联:"<<first;
                    qDebug()<<"下联:"<<second;
                    qDebug()<<"横批:"<<center;
                }
             }
         }
    }
    //更新token
    else if(function_select==4)
    {
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        {
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            {
                QJsonObject obj = document.object();
                //解析token
                if(obj.contains("access_token"))
                {
                     QString data_token=obj.take("access_token").toString();
                     Token=data_token.toUtf8();
                     qDebug()<<"更新的Token:"<<data_token;
                     //保存到文件
                     SaveDataToFile(Token);
                     QMessageBox::information(this,"提示","密匙更新成功.",
                     QMessageBox::Ok,QMessageBox::Ok);
                }
            }
        }
        return;
    }
}

 

3.3 token数据存储

/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{
    /*保存数据到文件,方便下次加载*/
    QString file;
    file=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
    QFile filesrc(file);
    filesrc.open(QIODevice::WriteOnly);
    QDataStream out(&filesrc);
    out << text;  //序列化写字符串
    filesrc.flush();
    filesrc.close();
}
​
​
/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{
    //读取配置文件
    QString text,data;
    text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
​
    //判断文件是否存在
    if(QFile::exists(text))
    {
        QFile filenew(text);
        filenew.open(QIODevice::ReadOnly);
        QDataStream in(&filenew); // 从文件读取序列化数据
        in >> data; //提取写入的数据
        filenew.close();
    }
    return data; //返回值读取的值
}

以上就是基于QT设计一个春联自动生成器的详细内容,更多关于QT春联生成器的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7055622163335741453

延伸 · 阅读

精彩推荐
  • C/C++C语言实现贪吃蛇游戏(命令行)

    C语言实现贪吃蛇游戏(命令行)

    这篇文章主要为大家详细介绍了C语言命令行实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiao_dou_ya_cool9272021-09-14
  • C/C++C++ 如何判断四个点是否构成正方形

    C++ 如何判断四个点是否构成正方形

    这篇文章主要介绍了C++ 如何判断四个点是否构成正方形的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    蹊言君10702021-10-28
  • C/C++怎么锁定鼠标的示例代码分享

    怎么锁定鼠标的示例代码分享

    使用代码怎么才能锁定鼠标?这个功能很简单只要一个ClipCursor()就可以搞定,需要的朋友可以参考下...

    C语言教程网7252021-01-14
  • C/C++关于STL中list容器的一些总结

    关于STL中list容器的一些总结

    list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效...

    C语言教程网11962021-01-01
  • C/C++VC++实现选择排序算法简单示例

    VC++实现选择排序算法简单示例

    这篇文章主要介绍了VC++实现选择排序算法简单示例,代码简洁易懂,有助于读者对数据结构与算法的学习,需要的朋友可以参考下...

    C++教程网10272021-01-25
  • C/C++C++语言io流处理基本操作教程示例

    C++语言io流处理基本操作教程示例

    这篇文章主要为大家介绍了C++语言io流处理的基本操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    xr4158192022-02-25
  • C/C++c语言描述回文数的三种算法

    c语言描述回文数的三种算法

    这篇文章主要介绍了c语言描述回文数的三种算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    广药_肖俊清5482021-07-28
  • C/C++详解C++中虚析构函数的作用及其原理分析

    详解C++中虚析构函数的作用及其原理分析

    这篇文章主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    Stoneplay266912021-07-27