基于谷歌模型gemini-pro 的开发的QT 对话项目

支持的功能,新建对话框,目前发现相关梯子不支持访问谷歌的api 的可能代理设置的不对,

 QNetworkAccessManager manager;

    // Set up your request
    QNetworkRequest request;
    request.setUrl(QUrl("https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=AIz****n_XRciLfpdkgruY"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    // Set up your JSON data
    QJsonObject textObj1;
    textObj1["text"] = "写一个故事";

    QJsonObject userRole1;
    userRole1["role"] = "user";
    userRole1["parts"] = QJsonArray() << textObj1;

    QJsonObject textObj2;
    textObj2["text"] = "In the bustling city of Meadow brook, lived a young girl named Sophie. She was a bright and curious soul with an imaginative mind.";

    QJsonObject modelRole;
    modelRole["role"] = "model";
    modelRole["parts"] = QJsonArray() << textObj2;

    QJsonObject textObj3;
    textObj3["text"] = "你用中文写一个故事?";

    QJsonObject userRole2;
    userRole2["role"] = "user";
    userRole2["parts"] = QJsonArray() << textObj3;

    QJsonArray contents;
    contents << userRole1 << modelRole << userRole2;

    QJsonObject mainObj;
    mainObj["contents"] = contents;

    QJsonDocument doc(mainObj);

    // Send the POST request
    QNetworkReply *reply = manager.post(request, doc.toJson());

    // Create an event loop
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

    // Wait until 'finished()' is emitted
    loop.exec();

    // Check the reply
    if (reply->error() == QNetworkReply::NoError) {
        QString strReply = (QString)reply->readAll();

        // Parse the JSON response
        QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
        QJsonObject jsonObject = jsonResponse.object();
        QJsonArray candidatesArray = jsonObject["candidates"].toArray();

        // Assume we only want the first candidate
        if (!candidatesArray.isEmpty()) {
            QJsonObject firstCandidate = candidatesArray[0].toObject();
            QJsonObject contentObject = firstCandidate["content"].toObject();
            QJsonArray partsArray = contentObject["parts"].toArray();

            // Assume we only want the text of the first part
            if (!partsArray.isEmpty()) {
                QJsonObject firstPart = partsArray[0].toObject();
                QString text = firstPart["text"].toString();

                qDebug() << "Extracted text: " << text;
            }
        }
    }
    else {
        qDebug() << "Failure" <<reply->errorString();
    }
    delete reply;

重点是QT的SSL :根据QT 的版本下载相关的ssl库

void MainWindow::provideContextMenu(const QPoint &pos) {
    QPoint globalPos = ui->listWidget->mapToGlobal(pos);

    QMenu menu;
    QAction *copyAction = menu.addAction("Copy");
    QAction *selectedItem = menu.exec(globalPos);

    if (selectedItem == copyAction) {
        QList<QListWidgetItem *> items = ui->listWidget->selectedItems();
        QStringList text;
        foreach(QListWidgetItem *item, items) {
            text.append(item->text());
        }
        QApplication::clipboard()->setText(text.join("\n"));
    }
}
void MainWindow::initializeChatSaveFile() {
    // 确保存储目录存在
      QString storeDirectory = "store";
      QDir dir(storeDirectory);
      if (!dir.exists()) {
          dir.mkpath("."); // 如果不存在,则创建目录
      }

      // 获取目录下所有的 txt 文件
      QStringList chatFiles = dir.entryList(QStringList() << "chat_*.txt", QDir::Files, QDir::Name);

      if (!chatFiles.isEmpty()) {
          // 如果至少存在一个文件,则读取第一个文件
          currentChatFileName = storeDirectory + "/" + chatFiles.first();
      } else {
          // 如果不存在任何文件,则创建一个新文件
          currentChatFileName = storeDirectory + "/chat_1.txt";
          QFile file(currentChatFileName);
          file.open(QIODevice::WriteOnly); // 创建新文件
          file.close();
      }
}

void MainWindow::saveChatAutomatically() {
    QFile file(currentChatFileName);
        if (!file.open(QIODevice::Append | QIODevice::Text)) {
            // 如果文件不能被打开,显示一个错误消息框
            QMessageBox::information(this, tr("Unable to open file"), file.errorString());
            return;
        }

        QTextStream out(&file);
        for (int i = 0; i < ui->listWidget->count(); ++i) {
            QListWidgetItem *item = ui->listWidget->item(i);
            out << item->text() << "\n"; // 写入每一行文本及一个换行符
        }

        file.close(); // 关闭文件
}
void MainWindow::showContextMenu(const QPoint &pos) {
    QPoint globalPos = ui->listView->mapToGlobal(pos);
       QMenu menu;

       QModelIndex index = ui->listView->indexAt(pos);
       if (index.isValid()) {
           // 如果点击的是有效项,则显示删除选项
           QAction *deleteAction = menu.addAction("删除对话");
           connect(deleteAction, &QAction::triggered, this, &MainWindow::deleteSelectedItem);
       } else {
           // 如果点击的是空白区域,则显示新建选项
           QAction *newAction = menu.addAction("添加新的对话");
           connect(newAction, &QAction::triggered, this, &MainWindow::createNewFile);
       }

       menu.exec(globalPos);
}

void MainWindow::deleteSelectedItem() {
    QModelIndex index = ui->listView->currentIndex();
    if (index.isValid()) {
        // 删除模型中的项
        model->removeRow(index.row());

        // 可选: 删除对应的文件
        QString fileName = model->itemFromIndex(index)->text();
        QFile::remove("store/" + fileName);
    }
}
void MainWindow::createNewFile() {
    // 获取下一个文件编号
       int fileNumber = 1;
       QString fileName;
       do {
           fileName = QString("store/chat_%1.txt").arg(fileNumber++);
       } while (QFile::exists(fileName));

       QFile file(fileName);
       if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
           // 错误处理,无法创建文件
           qDebug() << "Unable to create the file:" << fileName;
           return;
       }
       file.close();

       // 更新当前聊天文件名
       currentChatFileName = fileName;

       // 添加新项到ListView
       QStandardItem *item = new QStandardItem(QFileInfo(file).fileName());
       model->appendRow(item);

       // 选中并滚动到新创建的文件
       QModelIndex index = model->indexFromItem(item);
       ui->listView->setCurrentIndex(index);
       ui->listView->scrollTo(index);

       // 清空或加载新文件的内容到 QListWidget
       loadChatContent(); // 假设这个函数会清空当前内容并加载新文件的内容
}
void MainWindow::onFileDoubleClicked(const QModelIndex &index) {
    if (!index.isValid()) return;

    QString fileName = model->itemFromIndex(index)->text();
    currentChatFileName = "store/" + fileName; // 更新当前聊天文件名
    loadChatContent(); // 加载对应的聊天内容
}

完整版本代码,评论区留言邮箱发给你们(免费)

后续也会上传到github 上进行开源

想要获取直接运行版本的也可以直接留言私信我。

相关推荐
温轻舟2 分钟前
前端开发 -- 自定义鼠标指针样式
开发语言·前端·javascript·css·html·温轻舟
xiaocaibao77718 分钟前
编程语言的软件工程
开发语言·后端·golang
木易小熙23 分钟前
MySQL最左匹配原则是什么
数据库·mysql
Ocean☾25 分钟前
C语言-基因序列转换独热码(one-hot code)
c语言·开发语言
2401_8582861125 分钟前
117.【C语言】数据结构之排序(选择排序)
c语言·开发语言·数据结构·笔记·算法·排序算法
捕鲸叉27 分钟前
C++软件设计模式之类型模式和对象型模式
开发语言·c++·设计模式
魔道不误砍柴功28 分钟前
Java 中反射的高级用法:窥探 Java 世界的魔法之门
java·开发语言·python
Anna_Tong29 分钟前
全局流量管理:提升用户体验与保障服务稳定性
运维·服务器·网络·数据库·安全·负载均衡
2401_8576176239 分钟前
“无缝购物体验”:跨平台网上购物商城的设计与实现
java·开发语言·前端·安全·架构·php
觅远40 分钟前
python+reportlab创建PDF文件
开发语言·python·pdf