基于QT設(shè)計一個春聯(lián)自動生成器
1. 前言
春節(jié)是中國最隆重的傳統(tǒng)節(jié)日,一到過年家家戶戶肯定是要貼春聯(lián);在春節(jié)前夕,會用大紅紙張,加上濃墨書寫祝福詞語,在春節(jié)當天貼于門框兩邊,寓意著一年吉祥如意,還會將福字倒轉(zhuǎn)貼于門上,有"福到臨門"的意思。為了方便找到合適的春聯(lián)句子,我這里就采用現(xiàn)成的自然語言處理接口實現(xiàn)了一個自動生成春聯(lián)的軟件,輸入提示詞就可以完成春聯(lián)的生成,方便寫春聯(lián)時參考。
下面是實現(xiàn)的效果:



小時候最期盼的日子就是過年,可以穿新衣服,吃平時吃不到的好吃的,吃完年夜飯一起看春晚,放鞭炮;現(xiàn)在生活水平逐漸提高,平時穿的吃的也不差,也沒有很期待了,現(xiàn)在過年吃完飯大家都是盯著手機玩,感覺沒有以前小時候那種感覺了。
2. 實現(xiàn)原理
軟件是采用Qt框架設(shè)計,調(diào)用百度大腦的智能春聯(lián)接口完成春聯(lián)生成。
官網(wǎng)地址: https://ai.baidu.com/tech/nlp_apply

HTTP請求方法: POST
請求地址: https://aip.baidubce.com/rpc/2.0/creation/v1/couplets
URL的參數(shù):access_token 通過API Key和Secret Key獲取的access_token
請求頭Header:Content-Type application/json?
請求參數(shù)
text 春聯(lián)主題的提示字符
index 春聯(lián)的索引. 默認是0,同一個提示符,多次獲取時,這個索引+1就能訪問后面的春聯(lián).?
返回參數(shù)解釋
first 春聯(lián)上聯(lián):成7-9個字的上聯(lián)
second 春聯(lián)下聯(lián):生成7-9個字的春聯(lián)下聯(lián)
center 春聯(lián)橫批:生成4個字的春聯(lián)橫批
請求示例:
{
"text": "新水",
"index": 0
}返回的數(shù)據(jù)示例:
{
"couplets" : {
"first": "新春新水千山綠",
"second": "春色春風萬戶紅",
"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;
?
//打包請求參數(shù)賦值
QJsonObject post_data;
QJsonDocument document;
?
//設(shè)置請求地址
QUrl url;
QByteArray post_param;
?
//請求地址
requestUrl = "https://aip.baidubce.com/rpc/2.0/creation/v1/couplets";
?
//設(shè)置數(shù)據(jù)提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
?
//設(shè)置請求參數(shù):
post_data.insert("text",terms); //字符串(限5字符數(shù)以內(nèi))即春聯(lián)的主題
post_data.insert("index",index); //int 整數(shù) 默認為數(shù)值為0,即第一幅春聯(lián)。每換一次,數(shù)值加1即可,一定數(shù)量后會返回之前的春聯(lián)結(jié)果。
?
//構(gòu)造請求
url.setUrl(requestUrl + "?access_token=" + Token);
request.setUrl(url);
?
document.setObject(post_data);
post_param = document.toJson(QJsonDocument::Compact);
?
//發(fā)送請求
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":"萬象皆春","first":"龍年龍舞千秋業(yè)","second":"蛇歲蛇騰萬里春"},"log_id":1484407725829006888}"
?
上聯(lián): "龍年龍舞千秋業(yè)"
下聯(lián): "蛇歲蛇騰萬里春"
橫批: "萬象皆春"
?
上聯(lián): "虎躍龍騰千里虎"
下聯(liá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)
{
//判斷是否是對象,然后開始解析數(shù)據(jù)
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; //上聯(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)
{
//判斷是否是對象,然后開始解析數(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ù)存儲
/*
功能: 保存數(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; //序列化寫字符串
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; //提取寫入的數(shù)據(jù)
filenew.close();
}
return data; //返回值讀取的值
}以上就是基于QT設(shè)計一個春聯(lián)自動生成器的詳細內(nèi)容,更多關(guān)于QT春聯(lián)生成器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入探索C++中stack和queue的底層實現(xiàn)
這篇文章主要介紹了C++中的stack和dequeue的底層實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
C語言編程數(shù)據(jù)在內(nèi)存中的存儲詳解
本篇文章是C語言編程篇,主要為大家介紹C語言編程中數(shù)據(jù)在內(nèi)存中存儲解析,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
Visual?Studio下Eigen庫環(huán)境配置方式
這篇文章主要介紹了Visual?Studio下Eigen庫環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
使用MinGW使Windows通過gcc實現(xiàn)C或C++程序本地編譯執(zhí)行的方法
這篇文章主要介紹了使用MinGW使Windows通過gcc實現(xiàn)C或C++程序本地編譯執(zhí)行的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

