基于QT設(shè)計(jì)一個(gè)春聯(lián)自動(dòng)生成器
1. 前言
春節(jié)是中國(guó)最隆重的傳統(tǒng)節(jié)日,一到過(guò)年家家戶戶肯定是要貼春聯(lián);在春節(jié)前夕,會(huì)用大紅紙張,加上濃墨書(shū)寫(xiě)祝福詞語(yǔ),在春節(jié)當(dāng)天貼于門(mén)框兩邊,寓意著一年吉祥如意,還會(huì)將福字倒轉(zhuǎn)貼于門(mén)上,有"福到臨門(mén)"的意思。為了方便找到合適的春聯(lián)句子,我這里就采用現(xiàn)成的自然語(yǔ)言處理接口實(shí)現(xiàn)了一個(gè)自動(dòng)生成春聯(lián)的軟件,輸入提示詞就可以完成春聯(lián)的生成,方便寫(xiě)春聯(lián)時(shí)參考。
下面是實(shí)現(xiàn)的效果:
小時(shí)候最期盼的日子就是過(guò)年,可以穿新衣服,吃平時(shí)吃不到的好吃的,吃完年夜飯一起看春晚,放鞭炮;現(xiàn)在生活水平逐漸提高,平時(shí)穿的吃的也不差,也沒(méi)有很期待了,現(xiàn)在過(guò)年吃完飯大家都是盯著手機(jī)玩,感覺(jué)沒(méi)有以前小時(shí)候那種感覺(jué)了。
2. 實(shí)現(xiàn)原理
軟件是采用Qt框架設(shè)計(jì),調(diào)用百度大腦的智能春聯(lián)接口完成春聯(lián)生成。
官網(wǎng)地址: https://ai.baidu.com/tech/nlp_apply
HTTP請(qǐng)求方法: POST
請(qǐng)求地址: https://aip.baidubce.com/rpc/2.0/creation/v1/couplets
URL的參數(shù):access_token 通過(guò)API Key和Secret Key獲取的access_token
請(qǐng)求頭Header:Content-Type application/json?
請(qǐng)求參數(shù)
text 春聯(lián)主題的提示字符
index 春聯(lián)的索引. 默認(rèn)是0,同一個(gè)提示符,多次獲取時(shí),這個(gè)索引+1就能訪問(wèn)后面的春聯(lián).?
返回參數(shù)解釋
first 春聯(lián)上聯(lián):成7-9個(gè)字的上聯(lián)
second 春聯(lián)下聯(lián):生成7-9個(gè)字的春聯(lián)下聯(lián)
center 春聯(lián)橫批:生成4個(gè)字的春聯(lián)橫批
請(qǐng)求示例:
{ "text": "新水", "index": 0 }
返回的數(shù)據(jù)示例:
{ "couplets" : { "first": "新春新水千山綠", "second": "春色春風(fēng)萬(wàn)戶紅", "center": "喜迎新春" } }
3. 示例代碼
下面列出主要的核心代碼,可以直接貼到自己工程里就可以使用。
3.1 獲取春聯(lián)接口
//獲取春聯(lián) void Widget::get_CoupletText(QString terms,int index) { function_select=1; QString requestUrl; QNetworkRequest request; ? //存放圖片BASE64編碼 QString imgData; ? //打包請(qǐng)求參數(shù)賦值 QJsonObject post_data; QJsonDocument document; ? //設(shè)置請(qǐng)求地址 QUrl url; QByteArray post_param; ? //請(qǐng)求地址 requestUrl = "https://aip.baidubce.com/rpc/2.0/creation/v1/couplets"; ? //設(shè)置數(shù)據(jù)提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); ? //設(shè)置請(qǐng)求參數(shù): post_data.insert("text",terms); //字符串(限5字符數(shù)以?xún)?nèi))即春聯(lián)的主題 post_data.insert("index",index); //int 整數(shù) 默認(rèn)為數(shù)值為0,即第一幅春聯(lián)。每換一次,數(shù)值加1即可,一定數(shù)量后會(huì)返回之前的春聯(lián)結(jié)果。 ? //構(gòu)造請(qǐng)求 url.setUrl(requestUrl + "?access_token=" + Token); request.setUrl(url); ? document.setObject(post_data); post_param = document.toJson(QJsonDocument::Compact); ? //發(fā)送請(qǐng)求 manager->post(request, post_param); }
3.2 數(shù)據(jù)解析代碼
//解析反饋結(jié)果 void Widget::replyFinished(QNetworkReply *reply) { int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); ? //讀取所有數(shù)據(jù) QByteArray replyData = reply->readAll(); ? qDebug()<<"狀態(tài)碼:"<<statusCode; qDebug()<<"反饋的數(shù)據(jù):"<<QString(replyData); ? //判斷狀態(tài)碼 if(200 != statusCode) { return; } ? /* 反饋的數(shù)據(jù): "{"couplets":{"center":"萬(wàn)象皆春","first":"龍年龍舞千秋業(yè)","second":"蛇歲蛇騰萬(wàn)里春"},"log_id":1484407725829006888}" ? 上聯(lián): "龍年龍舞千秋業(yè)" 下聯(lián): "蛇歲蛇騰萬(wàn)里春" 橫批: "萬(wàn)象皆春" ? 上聯(lián): "虎躍龍騰千里虎" 下聯(lián): "龍騰虎躍萬(wàn)家龍" 橫批: "虎躍龍騰" ? */ if(function_select==1) //春聯(lián)生成 { //解析數(shù)據(jù) QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判斷是否是對(duì)象,然后開(kāi)始解析數(shù)據(jù) if(document.isObject()) { QJsonObject obj = document.object(); //解析錯(cuò)誤代碼 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; //上聯(lián)-第一 QString second; //下聯(lián)第二 ? 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="\n"; for(int i=0;i<first.size();i++) { first_1+=first.at(i); first_1+="\n"; } ? QString second_1="\n"; for(int i=0;i<second.size();i++) { second_1+=second.at(i); second_1+="\n"; } ? ui->label_1->setText(first_1); ui->label_2->setText(second_1); ? qDebug()<<"上聯(lián):"<<first; qDebug()<<"下聯(lián):"<<second; qDebug()<<"橫批:"<<center; } } } } //更新token else if(function_select==4) { //解析數(shù)據(jù) QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判斷是否是對(duì)象,然后開(kāi)始解析數(shù)據(jù) 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數(shù)據(jù)存儲(chǔ)
/* 功能: 保存數(shù)據(jù)到文件 */ void Widget::SaveDataToFile(QString text) { /*保存數(shù)據(jù)到文件,方便下次加載*/ QString file; file=QCoreApplication::applicationDirPath()+"/"+ConfigFile; QFile filesrc(file); filesrc.open(QIODevice::WriteOnly); QDataStream out(&filesrc); out << text; //序列化寫(xiě)字符串 filesrc.flush(); filesrc.close(); } ? ? /* 功能: 從文件讀取數(shù)據(jù) */ 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); // 從文件讀取序列化數(shù)據(jù) in >> data; //提取寫(xiě)入的數(shù)據(jù) filenew.close(); } return data; //返回值讀取的值 }
以上就是基于QT設(shè)計(jì)一個(gè)春聯(lián)自動(dòng)生成器的詳細(xì)內(nèi)容,更多關(guān)于QT春聯(lián)生成器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入探索C++中stack和queue的底層實(shí)現(xiàn)
這篇文章主要介紹了C++中的stack和dequeue的底層實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09C語(yǔ)言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解
本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中數(shù)據(jù)在內(nèi)存中存儲(chǔ)解析,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09Visual?Studio下Eigen庫(kù)環(huán)境配置方式
這篇文章主要介紹了Visual?Studio下Eigen庫(kù)環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12使用MinGW使Windows通過(guò)gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法
這篇文章主要介紹了使用MinGW使Windows通過(guò)gcc實(shí)現(xiàn)C或C++程序本地編譯執(zhí)行的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11