1.获取api (有免费10元额度)
DeepSeek
记得复制api,避免丢失频繁创建。
2.qt调用https请求
配置网络模块
QT += core gui widgets network
直接上代码
拿到代码替换api,和修正qt组件输入和输出即可。
#ifndef DEEPSEEKCLIENT_H
#define DEEPSEEKCLIENT_H#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include<QJsonArray>
#include <QSslSocket>namespace Ui {
class DeepSeekClient;
}class DeepSeekClient : public QWidget
{Q_OBJECTpublic:explicit DeepSeekClient(QWidget *parent = nullptr);~DeepSeekClient();void sendRequest(const QString &prompt);void handleResponse(QNetworkReply *reply);signals:void responseReceived(const QString &response);private slots:void on_pushButton_clicked();private:QNetworkAccessManager *manager;QString api_key = "sk-xxxx"; // 替换为你的API Key
private:Ui::DeepSeekClient *ui;
};#endif // DEEPSEEKCLIENT_H
#include "deepseekclient.h"
#include "ui_deepseekclient.h"
#include <QDebug>
#include"log/easylogging++.h"DeepSeekClient::DeepSeekClient(QWidget *parent) :QWidget(parent),ui(new Ui::DeepSeekClient)
{ui->setupUi(this);manager = new QNetworkAccessManager(this);// 设置样式表QString styleSheet = R"(QWidget {background-color: #f5f5f5;font-family: "Microsoft YaHei", Arial;}QTextEdit {background-color: white;border: 1px solid #ddd;border-radius: 8px;padding: 8px;font-size: 14px;}QLineEdit {background-color: white;border: 1px solid #ddd;border-radius: 8px;padding: 4px 12px;font-size: 14px;}QLineEdit:focus {border: 1px solid #4a90e2;}QPushButton {background-color: #4a90e2;color: white;border: none;border-radius: 8px;font-size: 14px;font-weight: bold;}QPushButton:hover {background-color: #357abd;}QPushButton:pressed {background-color: #2a5f96;})";this->setStyleSheet(styleSheet);// 检查SSL支持qDebug() << "SSL Support:" << QSslSocket::supportsSsl();qDebug() << "Build Version:" << QSslSocket::sslLibraryBuildVersionString();qDebug() << "Runtime Version:" << QSslSocket::sslLibraryVersionString();qDebug() << manager->supportedSchemes();
}DeepSeekClient::~DeepSeekClient()
{delete ui;
}///
/// dpseek发送数据
/// \param prompt
///
void DeepSeekClient::sendRequest(const QString &prompt) {// 显示思考状态QString userInput = ui->dpseek_input_edit->text();ui->dpseek_output_edit->append(QString("<div style='margin: 8px 0;'><b style='color: #4a90e2;'>您:</b> %1</div>").arg(userInput));ui->dpseek_output_edit->append(QString("<div style='margin: 8px 0; color: #666;'><i>AI正在思考中,请稍候...</i></div>"));// 禁用输入和发送按钮ui->dpseek_input_edit->setEnabled(false);ui->pushButton->setEnabled(false);QUrl url("https://api.deepseek.com/chat/completions");QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");request.setRawHeader("Authorization", ("Bearer " + api_key).toUtf8());QJsonObject body;body["model"] = "deepseek-chat";body["messages"] = QJsonArray{QJsonObject{{"role", "user"}, {"content", prompt}}};QNetworkReply *reply = manager->post(request, QJsonDocument(body).toJson());// 处理SSL错误connect(reply, &QNetworkReply::sslErrors, this, [reply]() {qDebug() << "SSL Errors occurred!";reply->ignoreSslErrors(); // 测试阶段忽略错误});connect(reply, &QNetworkReply::finished, [=]() {handleResponse(reply);reply->deleteLater();});
}
///
/// 接收数据,回调处理
/// \param reply
///
void DeepSeekClient::handleResponse(QNetworkReply *reply) {// 重新启用输入和发送按钮ui->dpseek_input_edit->setEnabled(true);ui->pushButton->setEnabled(true);if (reply->error() == QNetworkReply::NoError) {QByteArray response = reply->readAll();QJsonDocument doc = QJsonDocument::fromJson(response);QJsonObject json = doc.object();if (json.contains("choices")) {QString result = json["choices"].toArray()[0].toObject()["message"].toObject()["content"].toString();// 删除"正在思考"的提示QTextCursor cursor = ui->dpseek_output_edit->textCursor();cursor.movePosition(QTextCursor::End);cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::KeepAnchor);cursor.removeSelectedText();cursor.deletePreviousChar(); // 删除多余的换行// 显示AI回复ui->dpseek_output_edit->append(QString("<div style='margin: 8px 0; background-color: #f8f9fa; padding: 8px; border-radius: 4px;'><b style='color: #28a745;'>AI:</b> %1</div>").arg(result));// 清空输入框ui->dpseek_input_edit->clear();emit responseReceived(result);}} else {// 删除"正在思考"的提示QTextCursor cursor = ui->dpseek_output_edit->textCursor();cursor.movePosition(QTextCursor::End);cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::KeepAnchor);cursor.removeSelectedText();cursor.deletePreviousChar(); // 删除多余的换行QString errorMessage = QString("<div style='color: #dc3545; margin: 8px 0;'><b>错误:</b> %1</div>").arg(reply->errorString());ui->dpseek_output_edit->append(errorMessage);}
}
void DeepSeekClient::on_pushButton_clicked()
{LOG(INFO)<<"INPUT: "<<ui->dpseek_input_edit->text().toStdString();sendRequest(ui->dpseek_input_edit->text());
}
3.测试
把qt的界面组件输入输出替换即可
坑点!!
ssl1.1.1g报错处理,主要就是openssl版本兼容性问题导致,必须使用一致的dll版本。导致ssl不支持
官网还找不到了openssl 1.1.1g的安装包。
这里我提供安装包
通过网盘分享的文件:OpenSSL 1.1.1g-所需dll动态库文件.zip
链接: https://pan.baidu.com/s/16m5mmyd6J2LTeIIwRdDp1w 提取码: u3s7
--来自百度网盘超级会员v6的分享
把dll文件放到目录的build后面即可
学习资料分享
0voice · GitHub