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

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

 QNetworkAccessManager manager;// Set up your requestQNetworkRequest 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 dataQJsonObject 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 requestQNetworkReply *reply = manager.post(request, doc.toJson());// Create an event loopQEventLoop loop;QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));// Wait until 'finished()' is emittedloop.exec();// Check the replyif (reply->error() == QNetworkReply::NoError) {QString strReply = (QString)reply->readAll();// Parse the JSON responseQJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());QJsonObject jsonObject = jsonResponse.object();QJsonArray candidatesArray = jsonObject["candidates"].toArray();// Assume we only want the first candidateif (!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 partif (!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;// 添加新项到ListViewQStandardItem *item = new QStandardItem(QFileInfo(file).fileName());model->appendRow(item);// 选中并滚动到新创建的文件QModelIndex index = model->indexFromItem(item);ui->listView->setCurrentIndex(index);ui->listView->scrollTo(index);// 清空或加载新文件的内容到 QListWidgetloadChatContent(); // 假设这个函数会清空当前内容并加载新文件的内容
}
void MainWindow::onFileDoubleClicked(const QModelIndex &index) {if (!index.isValid()) return;QString fileName = model->itemFromIndex(index)->text();currentChatFileName = "store/" + fileName; // 更新当前聊天文件名loadChatContent(); // 加载对应的聊天内容
}

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lucene.net站内搜索—5、搜索引擎第一版实现

目录 Lucene.net站内搜索—1、SEO优化 Lucene.net站内搜索—2、Lucene.Net简介和分词 Lucene.net站内搜索—3、最简单搜索引擎代码Lucene.net站内搜索—4、搜索引擎第一版技术储备&#xff08;简单介绍Log4Net、生产者消费者模式&#xff09;Lucene.net站内搜索—5、搜索引擎第…

All your files have been encrypted

小弟的姑姑家的老板收银的电脑被黑客黑了,我来解决一下,小孩玩游戏玩电脑中的病毒, 方法很多种,仅供参考。 问题邮件截图: 参考方式: 方法一:给对方钱,一般比较贵,还不如重装系统。哈哈。 方法二:下载解密工具,尝试解密恢复数据, Ransomware File Decrypto Too…

8s yaml 配置生成_接口测试框架实战(六) | 配置的数据驱动

《Python 测试开发实战进阶》课程&#xff0c;4 个月挑战 BAT 大厂年薪 50W Offer&#xff0c;文末加群&#xff01;在实际工作中&#xff0c;为了便于维护&#xff0c;对于环境的切换和配置&#xff0c;通常不会使用硬编码的形式完成。在之前文章《多环境下的接口测试》中&…

使用JAXB和Jackson从XSD生成JSON模式

在本文中&#xff0c;我演示了一种从XML Schema &#xff08;XSD&#xff09;生成JSON Schema的 方法 。 在概述从XML Schema创建JSON Schema的方法的同时&#xff0c;本文还演示了JAXB实现的用法&#xff08;与JDK 9捆绑在一起的xjc版本2.2.12-b150331.1824 [build 1.9.0-ea-b…

Spring Integration完整示例

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

配置环境_JavaJDK环境变量配置

1.Java环境搭建1.1 JDK与JREJDK(Java Development Kit Java开发工具包)JDK是提供给Java开发人员使用的&#xff0c;其中包含了java的开发工具&#xff0c;也包括了JRE。所以安装了JDK&#xff0c;就不用在单独安装JRE了。其中开发工具&#xff1a;编译工具(javac.exe)打包工具(…

僵固式思维 OR 成长式思维

有意无意中&#xff0c;看到这样的一篇文章&#xff0c;觉得非常富有正能量&#xff0c;而且也比较有同感。而且&#xff0c;不仅仅对于职场暂时失落或者失意的人有帮助&#xff0c;就是对学生&#xff0c;也一样的。故特分享&#xff0c;以共勉之。 我想每个新人进入职场之后都…

Asp.net MVC 的一些总结(二)——图片显示

这里实现的是&#xff0c;如下图片所示的效果&#xff1a; 当然&#xff0c;当你看的下图的时候&#xff0c;请不要自己想当然的认为是简单的html布局&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;业务说明&#xff1a;图片地址是数据库里存的&#xff0c;图…

Spring整合基础

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

java 布局管理器_有时在Java中,一个布局管理器是不够的

java 布局管理器在开发Java Swing应用程序时&#xff0c;最经常的是&#xff0c;我们需要在多个嵌套面板中使用多个布局管理器。 这通常不是问题&#xff0c;被认为是几乎所有人类已知语言的所有UI开发的常规做法。 但是&#xff0c;大多数情况下&#xff0c;对于UI中的每个面板…

支付宝支付、微信支付(最详细教程)

对接支付宝支付接口&#xff0c;官方文档已经写的很清楚了&#xff0c;但是也有很多像我一样的小白&#xff0c;第一次对接支付宝支付接口&#xff0c;会有些迷茫&#xff0c;所以我在此写下这篇文章&#xff0c;给我和我一样的同学&#xff0c;一点思路吧。 第一步&#xff1…

降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算

本次采用中国土壤流失方程CSLE计算土壤侵蚀模数&#xff0c;计算公式为&#xff1a;ARKLSBET式中&#xff0c;式中&#xff1a;A—土壤侵蚀模数。thm-2a-1&#xff1b;R—降雨侵蚀力因子&#xff0c;MJmmhm-2h-1a-1&#xff1b;K—土壤可蚀性因子&#xff0c;thm2hhm-2MJmm-1&a…

购买阿里云ECS服务器忘记终端管理密码或者没有设置

自己开发一个APP,想把源码放到服务器上跑一跑,发现使用Xshell远程连接不上去,我记得买服务器的时候没有设置。 一般有两种方法: 1.买服务器的时候,阿里会给你发一份邮件,邮件里面有,这个是官方的说法,我是公司CTO,账号是老板开的,根本不可能看到邮件,所以对我来说不…

输出空格隔开换行_【前端干货】CSS 的空格处理

一空格规则HTML 代码的空格通常会被浏览器忽略。<p>◡◡hello◡◡world◡◡</p>上面是一行 HTML 代码&#xff0c;文字的前部、内部和后部各有两个空格。为了便于识别&#xff0c;这里使用半圆形符号◡表示空格。浏览器的输出结果如下。hello world可以看到&#x…

宝塔面板绑定域名导致无法访问

用这个命令rm -f /www/server/panel/data/domain.conf删除绑定域名后&#xff0c; 就能用ip端口进入面板了&#xff0c;以后还是不要绑定域名了 主要是因为我手残。 看重点&#xff0c;我是绑定了域名&#xff0c;用域名也无法访问。 现在终于进去啦

宝塔访问域名访问不到

首先说明一点&#xff0c;我这个问题不是宝塔面板绑定域名的那种情况。 浏览器输入域名会报上面的错误&#xff0c;经过各种尝试&#xff0c;发现是安全组没有放开&#xff0c;在阿里云控制台添加一个80/80的通用安全组规则即可&#xff0c;知道上行和下行的区别&#xff0c;打…

双千兆和双频千兆哪个好_关于千兆路由器的那些事儿!赶紧收藏

无线Wi-Fi已成为现代人生活、工作的标配&#xff0c;随着百兆乃至千兆的光纤网络普及&#xff0c;传统路由器已跟不上时代的速度了。不少用户的眼光已投向速度更快的千兆路由器&#xff0c;那么大家真的了解什么是千兆路由器吗&#xff1f;千兆路由器有哪几种&#xff1f;近期火…

华三ospf联动bfd_HCIE2020__路由交换专家__BFD综合实验

1.1.1 关于本实验本实验通过配置BFD与BGP协议联动及与VRRP协议联动&#xff0c;掌握BFD的功能和配置方法。1.1.2 实验目的理解BFD的工作原理。 掌握BFD与BGP联动的应用场景及配置方法。 掌握BFD与VRRP联动的应用场景及配置方法。1.1.3 实验组网介绍图1-1 BFD原理配置实验拓扑图…

大学生助学贷款如何还利息(本金+利息都可以)

生源地助学贷款还利息的步骤: 1、首先需要将钱转入支付宝,金额稍微高于应还款项即可。然后登陆电脑版支付宝,一定是要电脑登陆(手机上无法操作),如图所示 2、然后在支付宝主页中,点击右上角的“应用中心”,然后点击“生活服务”如图所示。

谷歌浏览器下载的内容老是自动打开

原因是每次下载内容在浏览器左下角都有提示&#xff0c;一般都是选择打开所在文件夹&#xff0c;一次手残&#xff0c;点了总是打开此文件导致一下载文件就自动打开。 解决方法。 1.点击右上角的... 2.找到设置-高级设置-下载 3.关掉我标红的位置信息即可。现在看不到啦&…