- 博客(52)
- 收藏
- 关注
原创 QT-UI 轮播窗口
本文介绍了实现类似网易云音乐播放器的卡片轮播窗口的UI布局和动画效果。采用垂直布局分为图片滚动窗口和索引窗口两部分。核心实现包括:1)计算三张图片的位置和大小,通过线性插值实现平滑过渡动画;2)使用QPainter绘制圆角矩形图片,实现近大远小的视觉效果;3)添加导航点和左右按钮控制轮播;4)利用定时器实现自动轮播功能。关键点在于动画过程中实时计算图片位置,通过分层绘制实现堆叠效果,同时处理好鼠标交互和自动轮播的切换逻辑。最终实现了流畅的卡片轮播效果,支持点击导航点和按钮切换图片。
2025-09-17 18:46:37
1039
原创 QT聊天项目DAY20
摘要:本文详细介绍了基于Redis的分布式锁实现机制及其在服务器集群中的应用。主要内容包括:1. 分布式锁的实现原理,通过Redis原子操作SET和Lua脚本确保锁的互斥性;2. 客户端异常下线处理机制,利用分布式锁保护会话状态更新;3. 单服务器和跨服务器踢人功能实现,通过GRPC协议完成服务器间通信;4. 锁互斥问题和智能指针使用的注意事项。系统采用会话ID和用户ID双重验证,结合Redis存储用户状态,实现了安全可靠的用户登录状态管理。
2025-08-20 13:51:31
722
原创 QT聊天项目DAY19
本文主要介绍了跨服务器通讯中的用户注册和好友交互功能实现。首先解决了注册时用户头像丢失问题,通过优化客户端代码和指针传递方式。随后详细阐述了基于gRPC的跨服务器通讯架构,包括服务启动、好友申请与授权流程,以及文本/图片消息的跨服务器传输机制。重点描述了消息从客户端打包、服务器解析转发到接收端处理的完整链路,涉及JSON和Protocol Buffers两种数据格式的转换,以及Qt界面组件的动态生成逻辑。通过Navicat设置唯一键约束确保了数据一致性。
2025-08-19 18:38:27
902
原创 QT聊天项目DAY18
多线程文件传输,能够熟练使用QT或者C++来分配线程和构建线程池,以及如何正确销毁一个线程;熟练应用互斥和锁以及智能指针和函数重载等,熟练应用队列来完成一些场景的需求
2025-08-11 19:54:02
919
原创 QT聊天项目DAY17
登录逻辑的梳理,先使用Http请求,验证Mysql中用户信息是否正确,如果正确,回发聊天服务器地址,建立稳定的TCP连接;聊天列表项和聊天窗口的绑定,当聊天列表项被点击时,会将当前的聊天窗口重新加载和当前客户的聊天记录搜索好友和添加好友一条龙,最后是通信包括文本通信和图片,至于文件传输,在后面会更新
2025-07-31 15:26:47
955
原创 QT聊天项目DAY16
客户端UI界面的搭建,有一个主界面为ChatWidget,在其下分为三块分别为侧边栏,侧边栏负责切换三种聊天界面分别是常用联系人栏(记录常用的联系人,像微信一样)还有聊天好友栏以及设置栏。接下来是各个UI布局的细节方面实现,比如搜索界面,聊天界面,联系人界面等等代码量比较大,有能力的朋友尽量自己手敲,可以学到很多很多东西的。
2025-07-18 14:24:57
1004
原创 QT聊天项目DAY15
先使用Http向GateServer发起登录请求,该GateServer再向Status请求聊天服务器的地址,当登录成功立即向聊天服务器建立Tcp连接,并且再次发送登录请求,从数据库中拉拽用户信息,好友信息等
2025-07-18 14:15:23
708
原创 QT聊天项目DAY14
添加客户端发送登录请求;添加服务器处理登录请求,利用栈的生命周期来自动回收连接池中的连接;创建状态服务器,用来分配聊天服务器给客户端;C++中线程的基本使用方法;从登录到获取响应时的全部逻辑梳理;自己使用Git来管理项目的常用方法;
2025-06-07 19:47:24
1016
原创 QT聊天项目DAY13
掌握如何使用样式表的方式自定义控件;掌握动态多态,由于注册窗口和忘记密码窗口有很多代码可以复用,并且有些槽函数是可以重写的,以及信号可以从基类继承,对于相同的逻辑可以在父类中写,子类中基于父类的实现接着实现;服务器中添加处理重置密码的请求以及相关的MysqlAPI;项目重新更换电脑环境;
2025-06-04 20:56:52
1125
原创 QT链接其他项目的C++文件报链接错误
询问AI发现这个链接错误是由于Qt的元对象系统(Meta-Object System)在链接阶段无法找到LogRecord类的元对象信息造成的。
2025-06-04 14:52:06
317
原创 QT聊天项目DAY12
注册逻辑中的密码哈希加密,并添加获取验证码的倒计时,可以锻炼自己的自定义控件水平;验证注册的输入是否合理主要是回调的检验逻辑;采用qss并且自定义标签,重写事件的方式来刷新标签的UI,而不是采用PaintEvent事件来切换UI,思路值得学习;注册成功的界面切换以及测试;
2025-05-23 21:02:12
708
原创 QT聊天项目DAY11
客户端发送注册请求,服务器处理注册,将注册信息写到Mysql中,为了更大利用性能使用Mysql连接池,学习使用存储过程,处理注册服务的一系列bug
2025-05-18 17:40:03
1156
原创 QT聊天项目DAY10
封装redis连接API,为了充分使用多线程的优势采用redis连接池避免事件循环中服务器往redis数据库里写东西的资源竞争,以及只有一个连接导致的性能颓势
2025-05-09 22:15:59
761
原创 QT聊天项目DAY09
安装redis到windows,以及编译redis库。记录自己解决docker安装redis的坎坷经历,顺便梳理一下整个逻辑。最后是连接redis库
2025-05-07 21:24:23
1464
原创 QT聊天项目DAY07
protobuf的语法版本 为 proto3定义当前的包名为message定义一个服务 VerifyService输入参数类型为 GetVerifyRequest返回值类型为 GetVarifyRsponse请求的参数结构为返回的参数结构为错误码 邮箱 和 验证码也就是这个.proto文件定义了一个基于gRpc的邮箱验证码服务接口,前端调用GetVerifyCode发起验证码请求,后端通过邮箱发出并返回结果,通信数据用Protobuf编码。
2025-05-04 17:15:53
833
原创 QT聊天项目DAY04
所以拷贝构造就是复制对方的引用,双方都可以管理同一片内存地址(浅拷贝)或者复制资源并另外创建一片新的内存空间(深拷贝),移动拷贝就是将对方地址拿过来自己用,并将对方从原地址迁移出去;如果对方不能对自己取地址可以直接触发移动拷贝构造,直接接管对方的内存资源,如果对方可以对自己地址则需要使用std::move()将左值变为右值并接管对方的资源。参数这种东西是记不住的,也没必要去记,反而报错类型好记,一般像模板实例上下文这样的,就是参数不匹配,问一下AI正确的参数类型是什么,补上就完事了。
2025-04-18 00:06:25
1080
原创 QT聊天项目开发DAY02
这两段代码其实是等价的,这就为同一个对象创建了第二个控制块,导致他们的引用计数都为1,造成了二次析构。使用条件极为苛刻,只有当该对象被Shared_Ptr管理时,才能够正常的使用,否则会报错。std::enable_shared_from_this正是为了解决这个问题而存在。即有多少个shared_ptr 共享该资源)每一个Shared_ptr 维护一个。
2025-04-13 23:31:10
948
原创 如何灵活使用增强输入系统与GAS框架
2.绑定增强输入系统,通过行为绑定技能,输入上下文来绑定行为和按键的关系,行为和行为之间可以互相管理,在行为触发时会调用对应的回调函数,在一开始就绑定了技能的标签作为回调函数的入参,在回调函数中通过技能系统组件来遍历注册到技能系统组件中的技能,最后来找到这个捆绑这个标签的技能最后触发该技能。3.定义行为,并在输入映射上下文中绑定与按键的映射关系,在角色初始化时注册该上下文到增强输入系统中。在角色类被控制器控制时,加载技能系统的资产来注册技能到技能系统组件下。至此GAS简易框架和增强输入系统已经构建完毕。
2025-04-10 10:33:57
276
原创 TPS入门DAY02 服务器篇
没搜到,没关系,可能这个关键字就不是头文件命名,在搜索UserWidget。直接将UMG添加到build.cs下即可。其实就是VS下的筛选器的名字。
2025-04-06 21:45:28
378
原创 虚幻FPS开发 day02:开枪以及光线追综
首先设置音效资产变量,在蓝图中动态的设置音效资产绑定开火事件,在输入事件中设置鼠标左键按下事件在代码中设置当鼠标左键按下时对应的槽函数,绑定输入事件和槽函数之间的关系获取开火资产GitHub - DruidMech/UE4-CPP-Shooter-Series: Unreal Engine C++ Shooter Series Project创建音效蓝图在BP_Character中设置资产至此,开火音效已经实现首先创建开火粒子特效变量以动态绑定资产,在我看来蓝图类就像是配置文件在鼠标左键点击开火时调用的回调
2025-03-13 19:36:17
609
原创 DAY09
此时将叔叔结点和父亲节点都设置为黑色,将祖父节点设置为红色,将祖父节点设置为当前结点,一直向上递归,直到祖父节点是红色(当前节点)。红黑树有一条性质是不能有两个连续的红色结点,因为插入的新结点是红色,所以其父亲结点不能是红色结点,如果是红色结点就需要做调整,而黑色结点不需要。其次保证当前指向结点的指针不能是黑色,因为插入的结点是红色的,如果当前的结点是黑色的,就意味着不会影响黑高也就没必要再网上递归了。// 将当前结点设置为祖父节点,下面的两层已经检查完毕,需要递归的向上检查。// 将祖父结点染成红色。
2024-09-30 22:25:32
821
原创 DAY08
创建了监听端口的socket,并将其作为事件添加到红黑树上监听以后,当epoll监听到连接请求,就往socket_server中添加新的socket,此时socket线程会通知gate服务的次级消息队列,插入一个消息,告诉它有新的连接建立。这个消息队列有两级,二级消息队列是供用工作线程调用的,一般工作线程会出队一个消息队列,然后从这个消息队列中出队一个消息(根据工作线程的权重来出队消息的个数),并找到该次级消息队列的所属服务,将消息当作该服务的callback函数的参数,来执行指定业务。
2024-09-27 20:22:46
816
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅