“深入浅出”系列之QT:(10)Qt接入Deepseek

news/2025/2/23 10:14:37

项目配置:

在.pro文件中添加网络模块:

 QT += core network

API配置:

  • 将apiUrl替换为实际的DeepSeek API端点

  • 将apiKey替换为你的有效API密钥

  • 根据API文档调整请求参数(模型名称、温度值等)

功能说明:

  • 使用QNetworkAccessManager处理HTTP请求

  • 自动处理JSON序列化/反序列化

  • 支持异步请求处理

  • 包含基本的错误处理

扩展建议:

  • 添加更完善的错误处理(HTTP状态码检查)

  • 实现异步回调机制

  • 添加请求超时处理

  • 支持流式响应(如果API支持)

  • 使用环境变量或配置文件管理API密钥

典型输出处理:

// 在handleResponse函数中可添加以下处理逻辑:if (!content.isEmpty()) {    qDebug() << "Received response:";    qDebug().noquote() << content;  // 保留原始格式} else {    qDebug() << "No content in response";}

代码举例:

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

class ApiClient : public QObject {
    Q_OBJECT
public:
    explicit ApiClient(QObject *parent = nullptr) : QObject(parent) {
        manager = new QNetworkAccessManager(this);
        connect(manager, &QNetworkAccessManager::finished, 
                this, &ApiClient::handleResponse);
    }

    void sendRequest(const QString &prompt) {
        // API配置
        const QString apiUrl = "https://api.deepseek.com/v1/chat/completions";
        const QString apiKey = "your_api_key_here"; // 请替换为实际API密钥

        // 创建请求
        QNetworkRequest request;
        request.setUrl(QUrl(apiUrl));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        request.setRawHeader("Authorization", 
                           QString("Bearer %1").arg(apiKey).toUtf8());

        // 构建JSON请求体
        QJsonObject requestBody;
        requestBody["model"] = "deepseek-chat";  // 根据实际模型名称修改
        requestBody["temperature"] = 0.7;
        requestBody["max_tokens"] = 1000;

        QJsonArray messages;
        QJsonObject systemMsg;
        systemMsg["role"] = "system";
        systemMsg["content"] = "You are a helpful assistant.";
        messages.append(systemMsg);

        QJsonObject userMsg;
        userMsg["role"] = "user";
        userMsg["content"] = prompt;
        messages.append(userMsg);

        requestBody["messages"] = messages;

        // 发送POST请求
        manager->post(request, QJsonDocument(requestBody).toJson());
    }

private slots:
    void handleResponse(QNetworkReply *reply) {
        if (reply->error()) {
            qDebug() << "Error:" << reply->errorString();
            reply->deleteLater();
            return;
        }

        // 解析响应
        QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
        QJsonObject jsonResponse = response.object();
        
        if (jsonResponse.contains("choices")) {
            QJsonArray choices = jsonResponse["choices"].toArray();
            if (!choices.isEmpty()) {
                QJsonObject choice = choices.first().toObject();
                QJsonObject message = choice["message"].toObject();
                QString content = message["content"].toString();
                qDebug() << "API Response:" << content;
            }
        } else {
            qDebug() << "Error response:" << response.toJson();
        }

        reply->deleteLater();
    }

private:
    QNetworkAccessManager *manager;
};

// 使用示例
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    ApiClient client;
    client.sendRequest("Explain quantum computing in simple terms");

    return a.exec();
}

#include "main.moc"

http://www.niftyadmin.cn/n/5860118.html

相关文章

Leetcode - 周赛436

目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举&#xff0c;在确定了每一个对角线的第一个元素…

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

Pycharm安装教程超详细图文教程,超详细Pycharm安装保姆级教程

文章目录 前言一、环境搭建1. 下载 PyCharm2. 下载 Python3. 安装 Python4. pycharm安装教程 总结 前言 在 Python 编程的广阔天地里&#xff0c;拥有一款强大且称手的集成开发环境&#xff08;IDE&#xff09;至关重要。PyCharm 作为 JetBrains 公司推出的一款专业 Python ID…

第1章大型互联网公司的基础架构——1.1 单机房的内部架构

所谓的应用后台就是指机房。机房架构是一个庞大的工程&#xff0c;你可能听说过很多大型互联网公司曾在各种技术峰会上介绍它们的“三地五中心”多机房&#xff0c;甚至是全球异地多活机房等&#xff0c;这些“高大上”的话题讨论的都是机房架构的内容。机房最简单的形式是单机…

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }

lwip和tcp/ip区别

lwIP 和 TCP/IP 的区别 lwIP&#xff08;Lightweight IP&#xff09;和 TCP/IP 并不是同一级别的概念&#xff0c;lwIP 实际上是一个 TCP/IP 协议栈的实现。我们可以这样理解&#xff1a; TCP/IP 是一个 网络协议模型&#xff0c;定义了 互联网通信的标准&#xff0c;包括 IP…

嵌入式八股,struct结构体和union联合体的联系与区别

struct和union都是用户自定义的数据类型&#xff0c;它们都可以包含多个成员&#xff0c;并且成员可以是不同的数据类型。 它们的成员都可以通过点运算符&#xff08;.&#xff09;或箭头运算符&#xff08;->&#xff09;进行访问。对于指针的访问用&#xff08;->&…

acm培训 part 7

这部分的重点是图论 1.题目解析 1.1 Stockbroker Grapevine 这道题的重点是通过图建立各个经纪人之间的关系&#xff0c;再存储传播所需要的值。通过不断模拟去找到所需要的最短时间&#xff0c;代码如下 #include<bits/stdc.h> using namespace std; const int INF10…