QT学习_青云客网络聊天

该博客介绍了如何利用QT界面实现青云客网络聊天功能。首先定义了AI聊天接口类`IAIChatter`,并创建了具体实现类`AIChatterQingYunKe`,通过QNetworkAccessManager进行网络请求与响应处理。当接收到用户输入后,`AIChatterQingYunKe`通过GET请求向青云客API发送消息,并在接收到回复后将内容通过信号传递给QT界面展示。
摘要由CSDN通过智能技术生成

青云客网络聊天

以下实现简单青云客网络聊天功能,使用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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值