GPTDemo

Qt 网络接口调用示例项目

作者
WildPointer
更新
2024-06-20
类型
自有项目
仓库
2 stars / 0 forks(抓取快照)

该仓库未提供 README,以下为抓取时的仓库信息。

语言组成

C++
92.6%
QMake
7.4%

文件结构

查看完整文件清单(9 个文件)
Code/GptDemo.pro
Code/NetWork.cpp
Code/NetWork.h
Code/main.cpp
Code/mainwindow.cpp
Code/mainwindow.h
Code/mainwindow.ui
GptDemo.exe
README.md

关键源码

Code/NetWork.h
Code/NetWork.h
#ifndef NETWORK_H#define NETWORK_H#include <QObject>#include <QUrlQuery>#include <QEventLoop>#include <QJsonArray>#include <QJsonObject>#include <QMessageBox>#include <QJsonDocument>#include <QNetworkReply>#include <QRegularExpression>#include <QNetworkAccessManager>class NetWork : public QObject{    Q_OBJECTpublic:    ~NetWork();    explicit NetWork();public:    //获取Accesstoken    int handle_GetAccessToken();    //修改询问语句    QString handle_SetEnquireText(const QString &enquiretext);    //设置鉴权元素    int handle_SetAuthentication(const QString &key, const QString &secret);private:    QString APIKey;                  //鉴权元素APIKey    QString APISecret;               //鉴权元素APISecret    QByteArray payload;              //请求内容    QString accessToken;             //返回的AccessToken    QNetworkReply *reply;            //发送POST请求    QRegularExpression Regex;        //正则表达式对象    QNetworkAccessManager *manager;  //网络访问管理器};#endif // NETWORK_H
Code/NetWork.cpp
Code/NetWork.cpp
#include "NetWork.h"NetWork::~NetWork(){    if(reply!=nullptr){        reply->deleteLater();        delete reply;    }    delete manager;}NetWork::NetWork(){    //初始化对象    APIKey = "";    APISecret = "";    accessToken = "";    manager = new QNetworkAccessManager(this);}/*  获取Accesstoken *  返回值:int(错误码,-1为异常,0为错误,1为无误)*/int NetWork::handle_GetAccessToken(){    if (reply->error() == QNetworkReply::NoError) {        QByteArray responseData = reply->readAll();        //修改正则表达式        Regex.setPattern("\"access_token\":\"([^\"]+)\"");        //在JSON字符串中进行匹配        QRegularExpressionMatch match = Regex.match(responseData);        // 如果找到匹配项,则提取access_token数据        if (match.hasMatch()) {            accessToken = match.captured(1);            QMessageBox::warning(nullptr,"提示","设置Accesstoken成功",QMessageBox::Ok);            return 1;        }    }    else {        accessToken = " ";      //Token置为空        QMessageBox::warning(nullptr,"错误",reply->errorString(),QMessageBox::Ok);        return 0;    }}/*  设置鉴权元素 *  返回值:int(错误码,-1为异常,0为错误,1为无误)*/int NetWork::handle_SetAuthentication(const QString &key, const QString &secret){    //更新APIKey和APISecret    APIKey = key;    APISecret = secret;    //初始化POST请求的参数    QUrlQuery params;    params.addQueryItem("grant_type", "client_credentials");    params.addQueryItem("client_id", APIKey);    params.addQueryItem("client_secret", APISecret);    QByteArray postData = params.toString(QUrl::FullyEncoded).toUtf8();    // 设置URL和请求头部    QNetworkRequest request;    request.setUrl(QUrl("https://aip.baidubce.com/oauth/2.0/token"));    request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");    request.setRawHeader("Accept", "application/json");    //将请求数据作为第二个参数传递给post函数    reply = manager->post(request, postData);    connect(reply, &QNetworkReply::readyRead,this,&NetWork::handle_GetAccessToken);    return 1;}/*  修改询问语句 *  enquiretext:询问语句 *  返回值:QString&(修改后的询问语句)*/QString NetWork::handle_SetEnquireText(const QString& enquiretext){    //清空请求内容和回复语句    payload = "";    //准备请求数据    QJsonObject messageObject;    messageObject["role"] = "user";    messageObject["content"] = enquiretext;    QJsonArray messagesArray;    messagesArray.append(messageObject);    QJsonObject requestBody;    requestBody["messages"] = messagesArray;    //将JSON对象转换为字符串    QJsonDocument doc(requestBody);    payload = doc.toJson();    //设置请求头    QNetworkRequest request;    QString url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + accessToken;    request.setUrl(QUrl(url));    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");    //发送POST请求    reply = manager->post(request, payload);    // 等待响应完成    QEventLoop loop;    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);    loop.exec();    // 读取响应数据    if (reply->error() == QNetworkReply::NoError) {        return reply->readAll();    } else {        QMessageBox::warning(nullptr,"错误",reply->errorString(),QMessageBox::Ok);        return " ";    }}
Code/mainwindow.cpp
Code/mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    ai_NetWork = new NetWork();}MainWindow::~MainWindow(){    delete ui;}/*  解析回复语句 *  text:回复语句*/void MainWindow::handle_GetAnswerText(const QString &text){    QString hex;    //定义正则表达式,用于获取指定result值后的数据    QRegularExpression regular("\"result\":\"(.*?)\"");    QRegularExpressionMatch match = regular.match(text);    QString matchedString = match.captured();   //捕获匹配正则表达式的数据    //设置正则表达式,用于匹配\x后面的数据    regular.setPattern("\\\\x([0-9A-Fa-f]{2})");    //迭代正则表达式匹配的结果    QRegularExpressionMatchIterator iteration = regular.globalMatch(matchedString);    while (iteration.hasNext()) {       //循环遍历寻找匹配数据        QRegularExpressionMatch match = iteration.next();        hex = match.captured(1);        bool ok;        int decimal = hex.toInt(&ok, 16);        if (ok) {            matchedString.replace(match.capturedStart(), match.capturedLength(), QString(QChar(decimal)));        }    }    //文本处理    matchedString.replace("result\":\"", "");    matchedString.replace("\\n", "\n");    ui->reply_Text->clear();    ui->reply_Text->setText(matchedString);}//询问Aivoid MainWindow::on_enquire_Btn_clicked(){    QString input_Text = ui->question_Text->toPlainText();    if(!input_Text.isEmpty()){    //判断是否输入文字        ui->question_Text->clear();        ui->reply_Text->setText("正在生成回复文本");        QString Str = ai_NetWork->handle_SetEnquireText(input_Text);        handle_GetAnswerText(Str);  //处理答复语句    }    else{        QMessageBox::warning(nullptr,"错误","未输入信息",QMessageBox::Ok);    }}//设置鉴权元素void MainWindow::on_set_API_clicked(){    QString input_Key = ui->key_Text->text();    QString input_Secret = ui->secret_Text->text();    if(input_Key.isEmpty() || input_Secret.isEmpty()){        QMessageBox::warning(nullptr,"错误","未输入鉴权元素",QMessageBox::Ok);    }else{        ai_NetWork->handle_SetAuthentication(input_Key,input_Secret);    //设置鉴权元素    }}
Code/main.cpp
Code/main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}
WildPointer

专注系统编程、工程实践与底层技术,记录 C++、Qt、OpenCV 与 VTK 的学习和实践。