QT学习_青云客网络聊天

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT学习_青云客网络聊天相关的知识,希望对你有一定的参考价值。

青云客网络聊天

以下实现简单青云客网络聊天功能,使用QT界面实现
在这里插入图片描述

聊天功能接口类设置

head:


/** AI聊天接口**/
class IAIChatter : public QObject
{
    Q_OBJECT
public:
    explicit IAIChatter(QObject *parent = nullptr);

public slots:
    virtual void chat(const QString& message)=0;

signals:
    void respond(QString);
    void error(QString);
};


/** 青云客 */
class AIChatterQingYunKe : public IAIChatter
{
    Q_OBJECT
public:
    explicit AIChatterQingYunKe(QObject* parent = nullptr);

public slots:
    virtual void chat(const QString &message) override;

private:
    QNetworkAccessManager* getManager;
};


sources:


IAIChatter::IAIChatter(QObject* parent)
    : QObject(parent)
{

}

/** 青云客闲聊,get方法 **/
//http://api.qingyunke.com/
AIChatterQingYunKe::AIChatterQingYunKe(QObject* parent)
    : IAIChatter(parent), getManager(new QNetworkAccessManager(this))
{
	//当getManager获取到传来的信息后,发送finished信号
	//然后由QNetworkReply对象响应,使用 readAll 函数读取数据信息
	
    QObject::connect(getManager, &QNetworkAccessManager::finished, [=](QNetworkReply* reply){
        do{
            if(reply->error() != QNetworkReply::NoError){
                emit error(reply->errorString());
                break;
            }

            QJsonParseError err;
            auto object = QJsonDocument::fromJson(reply->readAll(), &err).object();
            if(err.error != QJsonParseError::NoError){
                emit error(err.errorString());
                break;
            }

            qDebug() << "[chat result]" << object;
            if(object["result"].toInt() != 0){
                emit error(tr("解析失败, 状态码:%1").arg(object["status"].toInt()));
                break;
            }

            // 结果在json的content中
            emit respond(object["content"].toString());
        }while(0);

        reply->deleteLater();
    });
}

// get获取即可
void AIChatterQingYunKe::chat(const QString& message)
{
    QNetworkRequest request(QUrl("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + message));

    getManager->get(request);
}

QT界面程序编写

Widget head:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "IAIChatter.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void onrecord(const QString& message);
    void onrespond(const QString& message);

    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    AIChatterQYK *chatter;
};

#endif // WIDGET_H


widget source:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    chatter = new AIChatterQYK(this);

    //signals & slots
	
    QObject::connect(chatter,&AIChatterQYK::respond,
                     this,&Widget::onrespond);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onrespond(const QString &message)
{
    ui->textEdit->setText(message);
    qDebug()<<message;
}

void Widget::on_pushButton_clicked()
{
    QString str(ui->lineEdit->text());
    onrecord(str);
}

void Widget::onrecord(const QString &message)
{
    chatter->chat(message);
}

以上是关于QT学习_青云客网络聊天的主要内容,如果未能解决你的问题,请参考以下文章

有哪些API接口可以用来做聊天机器人?

QT 实用代码片段

qt 实现简单聊天(一个服务器和多个客服端)

QT学习_网络编程_TCP通信聊天

QT学习_网络编程_主机信息

青云系列网络中控HDMI视频矩阵在视频会议中的作用