基于谷歌模型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 上进行开源

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/267843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这一平台只要把握住风口期,自己就能当老板!

我是电商珠珠 短视频渐渐走进大家的视野&#xff0c;改变了大家的日常娱乐方式。从19年开始&#xff0c;抖音开始发展电商平台-抖音小店。 在改变大家娱乐方式的同时&#xff0c;还将直播电商的热度掀了起来&#xff0c;由此改变了大家的购物方式&#xff0c;给大家带来了方便…

ansible-playbook实操之一键搭建lnmp+wordpress

目录 1、架构和准备&#xff1a; 2、配置nginx角色&#xff1a; 3、配置mariadb角色&#xff1a; 4、配置php角色&#xff1a; 5、配置完之后&#xff0c;写脚本调用roles 6、配置完之后浏览器搭建wordpress&#xff1a; 1、架构和准备&#xff1a; 操控节点&#xff1a;…

Echarts社区推荐

Apache Echarts官方示例中&#xff0c;有的demo并不能完全符合我们的需求&#xff0c;下面推荐几个Echarts社区&#xff0c;以便快速搭建项目。 1. isqqw 官方地址 &#xff1a;https://www.isqqw.com/ 2. makepie 官方地址 &#xff1a;https://www.makeapie.cn/echarts 3. P…

20231224解决outcommit_id.xml1 parser error Document is empty的问题

20231224解决outcommit_id.xml1 parser error Document is empty的问题 2023/12/24 18:13 在开发RK3399的Android10的时候&#xff0c;出现&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

形态学处理

形态学处理的相关内容 &#xff08;1&#xff09;基于图像形态进行处理的一般方法 &#xff08;2&#xff09;这些处理方法基本是对二进制图像进行处理 &#xff08;3&#xff09;卷积核决定着图像处理后的结果 形态学图像处理 &#xff08;1&#xff09;腐蚀&#xff08;…

测试C#使用AForge从摄像头获取图片

百度“C# 摄像头”关键词&#xff0c;从搜索结果来看&#xff0c;使用OpenCV、AForge、window动态链接库获取摄像头数据的居多&#xff0c;本文学习基于Aforge.net连接摄像头并从摄像头获取图片的基本方法。   AForge相关包&#xff08;尤其是相关的控件&#xff09;主要针对…

【AIPRM】-高效管理Prompt模板,让你与众多AI互动更加流畅

关于AIPRM 链接: AIPERM AIPRM&#xff1a;Google 推出的AI提示管理工具。它提供多样化的Prompt模板&#xff0c;能帮助你与各种AI进行更加高效的互动。 登录 在主页点击“免费安装”–>Add to Chrome。 安装完成后&#xff0c;你在新的ChatGPT界面里面&#xff0c;能…

【四】记一次关于架构设计从0到1的讨论

记一次关于架构设计从0到1的讨论 简介&#xff1a; 在一次面试中和面试官讨论起来架构设计这个话题&#xff0c;一聊就不知不觉一个小时了&#xff0c;感觉意犹未尽。现在回想起来感觉挺有意思的&#xff0c;古人说独学而无友则孤陋而寡闻&#xff0c;的确是这样的&#xff0c…

基于SSM的搬家预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的搬家预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

css的定位

为什么需要定位&#xff1f; 场景&#xff1a; 某个元素可以自由的在一个盒子内移动位置&#xff0c;并且压住其他盒子当我们滚动窗口的时候&#xff0c;盒子是固定屏幕某个位置的。 这二个需求&#xff0c;使用标准流和浮动的方式是无法实现的或者是不容易实现&#xff0c;所以…

date-fns v3 发布——这个由 200 个函数组成的 JavaScript 日期处理套件

date-fns v3 发布——这个由 200 个函数组成的 JavaScript 日期处理套件已经在 TypeScript 中重写&#xff0c;重新引入了 String 日期参数&#xff0c;在 Node 上支持 ESM&#xff0c;并且所有函数现在都可以通过命名导出导出。 经过几个月的开发&#xff0c;v3 终于出来了&a…

手写Vue2源码

手写Vue2 使用rollup搭建开发环境 使用rollup打包第三方库会比webpack更轻量&#xff0c;速度更快 首先安装依赖 npm init -ynpm install rollup rollup-plugin-babel babel/core babel/preset-env --save-dev然后添加 rollup 的配置文件 rollup.config.js import babel f…

react 路由v6

这里是区别&#xff1a;V5 vs V6 这里是官网&#xff1a;可以查看更多高级属性 一、基本使用&#xff1a; 1、配置文件 src/routes/index import React from "react";const Home React.lazy(() > import("../Pages/Home")); const About React.laz…

探索 HTTP 请求的世界:get 和 post 的奥秘(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

html之如何设置音频和视频

文章目录 前言一、音频标签&#xff1a;audio1.audio简介2.常用属性controlsautoplayloop代码演示&#xff1a; 二、视频标签&#xff1a;video1.video2.常用的视频元素controlsautoplayloop代码演示&#xff1a; 总结视频元素总结音频元素总结 前言 html中插入音频和视频的方…

超维空间S2无人机使用说明书——51、使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

14章总结

一.lambda表达式 1.lambda表达式简介 lambda表达式不能独立执行&#xff0c;因此必须实现函数式接口&#xff0c;并且会返回一个函数式接口的对象。 语法&#xff1a; ()->结果表达式 参数->结果表达式 (参数1&#xff0c;参数2&#xff0c;...&#xff0c;参数n)->…

老鹰目标检测数据集VOC格式60张

老鹰是天空中的王者&#xff0c;它们拥有极佳的飞行能力。它们能以惊人的速度在天空中翱翔&#xff0c;尤其擅长高空俯冲捕食。老鹰的视力非常敏锐&#xff0c;能够准确地发现地面上的猎物&#xff0c;并迅速下落抓取。它们的爪子强而有力&#xff0c;足以击倒比自己体型庞大的…

顶级旗舰ET9出道,蔚来还是那个「最不计成本」的中国车品牌

作者 |张祥威 编辑 |德新 2008年&#xff0c;李斌和新浪的曹国伟几人一起喝酒&#xff0c;发了第一条微博&#xff0c;「天冷带围巾&#xff0c;心冷发微博」&#xff0c;一晚上涨了2000多个粉丝&#xff0c;他偶尔还会针砭时事&#xff0c;很快积累了最早一波粉丝。 创立蔚来…

各种边缘检测算子的比较研究

边缘检测算子比较研究 文章目录 边缘检测算子比较研究一、引言1.1 边缘检测的重要性1.2 研究背景与意义1.3 研究目的和论文结构 二、文献综述2.1 边缘检测概述2.2 Roberts、Prewitt、Sobel、Laplacian 和 Canny 算子的理论基础和历史2.2.1 **Roberts算子&#xff1a;**2.2.2 **…