用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!

一、项目需求分析与技术选型

DeepSeekAssistant是一款基于深度求索(DeepSeek)API的智能对话助手,核心需求包括:

  • 用户界面友好:支持多轮对话展示
  • 数据持久化:历史记录存储与检索
  • 异步网络通信:API请求响应处理
  • 交互优化:输入防抖、耗时统计等功能

技术选型采用C++17标准与Qt6框架,主要考虑:

  1. Qt的跨平台特性(Windows/Linux/macOS)
  2. QWidgets框架的成熟控件体系
  3. 原生性能优势(相较Electron等方案)

二、开发者接入全流程

2.1 第三方开发者认证

通过DeepSeek开放平台完成:

  1. 注册企业开发者账号(个人开发者选择对应类型)
  2. 签署API使用协议
  3. 创建应用获取Client ID和Secret
// 示例授权头构造
QNetworkRequest createRequest(const QString &url) {QNetworkRequest request(url);request.setRawHeader("Authorization", QString("Bearer %1").arg(apiKey).toUtf8());return request;
}

2.2 API文档关键解读

重点关注:

  • 对话API的流式/非流式接口区别
  • 计费策略(按token计数)
  • 速率限制(RPM/RPD策略)
  • 错误代码体系(401/429/503等)

三、核心模块实现详解

3.1 网络通信层

采用Qt Network模块实现异步HTTP通信:

class NetworkManager : public QObject {Q_OBJECT
public:explicit NetworkManager(QObject *parent = nullptr);void postRequest(const QString &url, const QJsonDocument &body);private:QNetworkAccessManager *manager;QElapsedTimer timer;signals:void responseReceived(const QString &result);void errorOccurred(int code);
};

关键技术点:

  • QNetworkAccessManager的线程安全使用
  • 超时重试机制(结合QTimer实现)
  • 响应数据流式处理(针对chunked传输)

3.2 数据持久化模块

SQLite数据库设计:

CREATE TABLE conversation (id INTEGER PRIMARY KEY AUTOINCREMENT,session_id TEXT NOT NULL,query TEXT NOT NULL,answer TEXT,token_count INTEGER,cost REAL,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

使用Qt SQL模块实现ORM层:

class DBManager {
public:bool saveMessage(const Message &msg) {QSqlQuery query;query.prepare("INSERT INTO conversation (...) VALUES (...)");// 绑定参数...return query.exec();}
};

3.3 UI架构设计

采用MVC模式实现界面交互:

MainWindow
├── ConversationView (QListView)
├── InputPanel 
│   ├── QLineEdit (输入框)
│   └── QPushButton (发送)
├── StatusBar
│   ├── QProgressBar (耗时)
│   └── QLabel (Token统计)
└── SettingsDialog├── QComboBox (模型选择)└── QSpinBox (温度参数)

关键控件实现:

  1. 自定义消息代理(继承QStyledItemDelegate)
  2. 输入验证器(QIntValidator用于参数设置)
  3. QSS样式定制:
QProgressBar {border: 1px solid #3A3A3A;border-radius: 5px;text-align: center;
}
QProgressBar::chunk {background-color: #4CAF50;
}

四、高级功能实现

4.1 计时器系统

class TimingSystem : public QObject {Q_OBJECT
public:void startTask() {elapsedTimer.start();QTimer::singleShot(500, [this](){emit timeout();});}qint64 elapsed() const {return elapsedTimer.elapsed();}private:QElapsedTimer elapsedTimer;
};

应用场景:

  • 输入防抖(延迟500ms触发请求)
  • API响应耗时统计
  • 自动保存定时任务

4.2 异步任务处理

使用QtConcurrent实现计算分流:

QFuture<void> future = QtConcurrent::run([=](){// 执行耗时操作processData(data);
});
QFutureWatcher<void> *watcher = new QFutureWatcher<void>();
connect(watcher, &QFutureWatcher<void>::finished, this, [=](){// 更新UI
});

五、测试与部署

5.1 单元测试框架

使用QTestLib进行核心模块验证:

void TestNetworkManager::testTimeout() {NetworkManager manager;QSignalSpy spy(&manager, &NetworkManager::errorOccurred);manager.postRequest("http://invalid.url", QJsonDocument());QVERIFY(spy.wait(10000));
}

5.2 打包发布

使用windeployqt(Windows)或linuxdeployqt(Linux)制作可分发包,通过Inno Setup生成安装程序。

六、技术栈能量映射

技术领域

对应岗位

面试考察点

Qt Widgets开发

客户端开发工程师

自定义控件实现、事件处理

网络编程

后端开发工程师

HTTP协议栈、RESTful实践

SQLite优化

数据存储工程师

索引优化、事务控制

多线程编程

系统架构师

线程安全、资源竞争

跨平台打包

DevOps工程师

持续集成/持续部署

七、岗位能力映射表

  1. Qt开发工程师:UI架构设计、跨平台适配
  2. 后端开发工程师:API接口封装、网络通信优化
  3. 全栈开发工程师:前后端数据交互设计
  4. 客户端开发工程师:本地存储方案设计

八、高频面试问题TOP5

  1. Qt信号槽机制底层实现原理

元对象系统(MOC)

线程间通信方式(Auto/Direct/Queued)

  1. SQLite并发写入处理方案

写锁机制(WAL模式)

事务重试策略

  1. QNetworkAccessManager的线程注意事项

主线程创建原则

跨线程信号传递

  1. Qt样式表的应用层级

样式继承规则

伪状态控制(hover/checked)

  1. 大文本处理的内存优化

 分页加载机制

零拷贝技术应用

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

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

相关文章

linux 软件扩展GPU显存

概述 共享内存可以通过 Unified Memory&#xff08;统一内存&#xff09;来实现&#xff0c;它允许 CPU 和 GPU 共享相同的内存地址空间&#xff0c;从而方便数据的传输和访问。 利用该技术可解决家用GPU 机器学习时显存不足的问题 &#xff08;注&#xff1a; 虽然解决了爆显…

Linux——进程初步

学进程前我们需要知道什么&#xff1f; 一、冯诺依曼体系结构 图中就是我们电脑运作时的大致工作流程&#xff0c;其中输入设备、输出设备我们也叫外设。其中&#xff0c;输入设备有比如键盘、鼠标、磁盘、摄像头等。输出设备有显示器、磁盘、打印机等。图中的存储器我们也叫内…

LeetCode-122. 买卖股票的最佳时机 II

其实这题画个折线图就很清晰了&#xff0c;因为我们每天都可以买卖股票&#xff0c;所有我们就只计算上升趋势的股票收益就好了&#xff0c;最小刻度为1&#xff0c;进行差值计算&#xff0c;取总和。 var maxProfit function(prices){let sum0;for(let i1;i<prices.leng…

关于前后端整合和打包成exe文件的个人的总结和思考

前言 感觉有很多东西&#xff0c;不知道写什么&#xff0c;随便写点吧。 正文 前后端合并 就不说怎么开发的&#xff0c;就说点个人感觉重要的东西。 前端用ReactViteaxios随便写一个demo&#xff0c;用于CRUD。 后端用Django REST Framework。 设置前端打包 import { …

Vue | 开学第一课!零基础教程

目录 背景介绍 安装方式 下载环境软件 NodeJS手册 如何查看node版本 镜像源 完整流程 创建根文件夹并拖进 VSCode 调用控制台 安装 vite 脚手架 配置项目 安装依赖 启动项目 查看页面 问题 创建项目失败 解决方法 权限问题 解决方法 其他问题 背景介绍 今…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况&#xff0c;那么这里就有一些如下的注意事项&#xff0c;如以下代码&#xff1a; // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

Tomato靶机攻略

将tomato改为NAT模式 扫描ip arp-scan -l 扫描端口&#xff0c;发现ssh服务端口从22改为2211 扫描目录 发现http://192.168.31.134/antibot_image/ 访问 查看所有php文件的源码&#xff0c;看看有什么不同的地方 在info.php的源码中发现问题 在输入后&#xff0c;成功显示…

EasyRTC嵌入式音视频通话SDK:基于纯C语言的跨平台实时通信系统设计与实践

随着物联网、移动互联网的快速发展&#xff0c;实时音视频通信技术在智能硬件、远程协作、工业控制等领域广泛应用。然而&#xff0c;跨平台兼容性差、资源占用高、定制化难等问题&#xff0c;仍是传统RTC方案的痛点。 EasyRTC嵌入式音视频通话SDK凭借纯C语言设计与全平台覆盖…

HCIP复习拓扑练习(修改版)

拓扑&#xff1a; 实际&#xff1a; 需求&#xff1a; 需求分析 1.这意味着学校内部网络能够正常解析域名并进行互联网访问。 2. PC1和PC2处于同一个内网192.168.1.0/24&#xff0c;其中PC1有权限访问外部网段3.3.3.0/24&#xff0c;而PC2没有。这涉及ACL&#xff08;访问控制…

vue-next-admin修改配置指南

目录 1.如何开启侧边栏logo 2.修改侧边栏顶部的logo与文字 3.修改侧边栏路由logo 4.浏览器标题栏图标与文字修改 5.修改侧边栏的背景颜色、顶部导航栏背景颜色、字体颜色、激活时颜色等 6.去除或添加修改右上方放大、信息、头像昵称&#xff08;登录获取之后存储进行修改图…

ruoyi-cloud-plus编译记录-1

dockerfile部署jar 添加一个run configuration ‘ruoyi-nacos’ run configuration 参考Docker - 在IntelliJ IDEA中一键部署项目 - hucat - 博客园 jar包编译不成功&#xff0c;没有jar&#xff0c;docker部署nacos就没法进行下去 参考链接 maven 构建报错 This failure was…

【算法day8】整数反转

整数反转 https://leetcode.cn/problems/reverse-integer/description/ class Solution { public:int reverse(int x) {int MAX_LENGTH 11; // 32位整数的最大数字的位数int* num (int*)calloc(sizeof(int), MAX_LENGTH); //用于保存进位每一位的数字int current x;int pos…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制

概述 雷达上位机是雷达系统中用于数据可视化、分析和控制的核心软件。本文将介绍如何使用 C# 和 WPF 框架开发一个雷达上位机程序&#xff0c;主要功能包括&#xff1a; 显示目标轨迹&#xff1a;在界面上实时绘制雷达探测到的目标轨迹。点击显示详细信息&#xff1a;用户点击…

「string」笔记

参考&#xff1a;比特鹏哥 1. string string是一种类型&#xff0c;指的是字符串&#xff0c;比字符数组更高级 头文件 <string> #include <string>int main() {string a;//未初始化string b "good good";//初始化string c("good sfternoon&q…

AutoGen使用学习

AutoGen使用学习 上篇文件使用使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】&#xff0c;本次系统的学习autoGen的使用方法 文章目录 AutoGen使用学习[toc]1-核心知识点2-参考网址3-实战案例1-autoGen安装和基础使用主要功能安装方法使用示例注意事…

207、【图论】孤岛的总面积

题目 思路 相比于 206、【图论】岛屿数量&#xff0c;就是在这个代码的基础上。先遍历边界&#xff0c;将边界连接的岛屿变为0&#xff0c;然后再计算一遍当前为1的岛屿面积。 代码实现 import collectionsn, m list(map(int, input().split())) graph []for _ in range(n…

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

在芯片设计的后端流程中,通过metal修timing是什么意思,怎么实施。举个timing违例说明一下

芯片设计后端流程中通过Metal修Timing 在芯片设计后端流程中&#xff0c;"通过metal修timing"是指通过调整金属层布线来解决时序违例问题的一种技术手段。这是物理设计阶段常用的优化方法之一。 什么是通过Metal修Timing 在芯片设计中&#xff0c;Metal&#xff08;金…