1. 相关知识
主要用到QNetwork和QJson。
2. 示例程序
首先,创建UI,PlainText用于输入想说的话,Label用于显示生成的话,一个按钮用于生成。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void onNetworkReply(QNetworkReply *reply);
private slots:
void on_btnGenerate_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.pp
需要将API-Key替换成自己的。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->btnGenerate, SIGNAL(clicked()), this, SLOT(on_btnGenerate_clicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onNetworkReply(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
QMessageBox::critical(this, "Error", "Network error: " + reply->errorString());
return;
}
QByteArray data = reply->readAll();
QJsonDocument json = QJsonDocument::fromJson(data);
if (json.isNull()) {
QMessageBox::critical(this, "Error", "JSON error: invalid data received from server");
return;
}
QJsonObject result = json.object()["choices"].toArray()[0].toObject();
QString generated_text = result["text"].toString();
qDebug() << generated_text;
ui->txtGenerated->setText(generated_text);
}
void MainWindow::on_btnGenerate_clicked()
{
QString prompt = ui->txtPrompt->toPlainText();
QString api_key = "xxx";
QString api_url = "https://api.openai.com/v1/engines/davinci-codex/completions";
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl(api_url));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Authorization", api_key.toUtf8());
QJsonObject input;
input.insert("prompt", prompt);
input.insert("temperature", 0.7);
input.insert("max_tokens", 100);
input.insert("top_p", 1.0);
input.insert("frequency_penalty", 0.5);
input.insert("presence_penalty", 0.5);
input.insert("stop", "");
QJsonObject data;
data.insert("inputs", input);
QJsonDocument json(data);
manager->post(request, json.toJson());
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onNetworkReply(QNetworkReply*)));
}
效果如下:
但是生成时有一个问题,可能是加密的问题,还未解决。
扫描二维码关注公众号,回复:
14605758 查看本文章
以上。