此项目分为两个源程序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;//打印表示回话成功
}

效果图如下:
                                    基于QT的图灵机器人交互

相关文章: