此项目分为两个源程序widget.h widget.cpp。
首先需要在*.pro里面加上QT +=network;QT+=script;
1、首先介绍widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include < QWidget >
#include < QtNetwork >
#include < QPushButton >
#include < QHBoxLayout >
#include < QVBoxLayout >
#include < QLabel >
#include < QTextEdit >
#include < QJsonDocument >
#include < QJsonParseError >
#include < QtScript/QScriptEngine >
#include < QScriptValueIterator >
#include < QDebug >
//以上均是一些必要的头文件
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots://槽函数
void send();//向图灵机器人发送对话
void clear();//清空
void replyFinish(QNetworkReply *); //接受图灵机器人返回的回话
void on_readyRead();//查看发送/接受的状态
private:
QLabel *lb1,*lb2;//lb1--解释是输入框,lb2--解释是输出框
QPushButton *pb1,*pb2;//pb1是发送按钮,pb2是清空按钮(清空输入/输出框的内容)
QTextEdit *le1,*le2;
//le1是对话输入框,le2是回应对话框*/
const QString URL="http://www.tuling123.com/openapi/api";
//图灵机器人的URL
const QString API_KEY="84b4094632274f688bd24decddf2d8e2";
//""里面是自己的图灵机器人API_KEY
};
#endif // WIDGET_H
#endif // WIDGET_H
2.然后再介绍widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent)
{
//设置窗口的最小大小为300(像素点)*300(像素点)
setMinimumSize(300,300);
lb1=new QLabel("输入");
lb2=new QLabel("输出");
pb1=new QPushButton("发送");
pb2=new QPushButton("清空");
le1=new QTextEdit;
le2=new QTextEdit;
//以上是创建按钮、标签以及文本框
QHBoxLayout *hbox1=new QHBoxLayout;
hbox1->addWidget(lb1);
hbox1->addWidget(le1);
QHBoxLayout *hbox2=new QHBoxLayout;
hbox2->addWidget(lb2);
hbox2->addWidget(le2);
QHBoxLayout *hbox3=new QHBoxLayout;
hbox3->addWidget(pb1);
hbox3->addWidget(pb2);
QVBoxLayout *vbox=new QVBoxLayout;
vbox->addLayout(hbox1);
vbox->addLayout(hbox2);
vbox->addLayout(hbox3);
setLayout(vbox);
//设置布局以及显示布局
//按钮的信号与槽
connect(pb1,SIGNAL(clicked(bool)),this,SLOT(send()));
connect(pb2,SIGNAL(clicked(bool)),this,SLOT(clear()));
}
Widget::~Widget()
{
//析构函数什么也没做
}
void Widget::send()
{
QString Url=URL+"?key="+API_KEY+"&info="+le1->toPlainText();
//拼接对话信息
QUrl url;
url.setUrl(Url);//格式转换
QNetworkRequest request(url);//传输对话信息
QNetworkAccessManager *manager=new QNetworkAccessManager(this);
QNetworkReply *reply=manager->get(request);
//等待回话信息
//回话的信号与槽
connect(manager,SIGNAL(finished(QNetworkReply *)),this,SLOT(replyFinish(QNetworkReply *)));
connect(reply,SIGNAL(readyRead()),this,SLOT(on_readyRead()));
}
void Widget::clear()
{
QString str="";//空字符串
le2->setText(str);//回应对话框变为空字符串
le1->setText(str);//输入对话框变为空字符串
}
void Widget::replyFinish(QNetworkReply *reply)
{
QString data=reply->readAll();//读取回话信息
QString strText="";
QScriptValue jsontext;
QScriptEngine engineText;
jsontext=engineText.evaluate("value="+data);
QScriptValueIterator iteratorText(jsontext);
//解析回话信息
while(iteratorText.hasNext())
{
iteratorText.next();
if(iteratorText.name()=="text")
{
strText=iteratorText.value().toString();
le2->setText(strText);
//回话对话框设置为回话信息
break;
}
}
}
void Widget::on_readyRead()
{
qDebug()<<"changing ~~~"<<endl;//打印表示回话成功
}
效果图如下: