- 博客(147)
- 资源 (28)
- 收藏
- 关注

原创 扔掉xshell,基于 QT 实现一个串口命令行工具(带源码)
所以基于串口的命令行工具有个特点是:如果串口连接不正常或者串口正常但是下位机程序运行不正常,通过上位机发送的命令下位机无法回复,则上位机不显示任何东西(因为没有收到下位机的回复)。所以对于我们的程序来讲,需要特殊处理的字符就是33个字符,当然并不是所有,我们只需要处理我们常见的支持的字符即可,比如回车符、制表符等。而其他的字符作为用户输入的指令进行下发和回显即可。可以看到我们write一个字符,下位机就回复一个字符,直到我们发送"0D",也就是Enter键"\r",下位机才会返回这个指令的最终响应数据。
2023-12-11 21:02:01
1495
1

原创 扔掉sql语句,用 QxOrm 让你的数据库操作从来没有这么简单过!
扔掉sql语句,用 QxOrm 让你的数据库操作从来没有这么简单过!ORM 全称是 Object Relational Mapping(对象关系映射),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
2023-12-07 11:12:32
1511

原创 NDK撩妹三部曲(五)— NDK 开发以及 so 库体积优化总结与学习笔记(深度干货,值得收藏)
前段时间做完我们的 SDK 项目,没有关注 so 库大小这块,现在慢慢稳定了就需要追求 so 库体积了。小团队一般可能不会在意这个东西,毕竟现在流量已经不是几年前的奢侈品了。但是要知道so库的大小不仅影响的是应用商店app的大小,还有一个很大的影响就是在广告页面渠道要求的秒下载,太大的app下载速度慢用户会不耐烦,直接影响了这部分用户的转化。本文导航1、从支持的abi架构入手优化7种abi架构简介abi 兼容性Android 加载so库顺序注意事项主流app支持的abi2、gcc/clang编译参数优
2020-06-16 21:21:38
10151
12

原创 NDK撩妹三部曲(三)—美女,我看你婀娜多姿,宛若天仙,这本“ndk排错指南”就送你了
“NDK”开发路上有很多坑?别怕,答案在这里从何说起? 昨天算是真正的带妹子入坑了,这不,又给我买奶茶了。But,路漫漫其修远兮,没过两天,妹子就又来找我了。“Q哥,我最近碰到一些问题,麻烦你帮我看一下呗”? 妹子是个聪明人,又补充道“餐厅新开了一家麻辣烫,下班请你吃”。呵,我大丈夫岂能为了份麻辣烫而折腰?“有冰封没?”,我问道。俗话说,人不要脸,天下无敌,为了不辜负妹子的厚望,我决定拿出久封的必杀秘籍,“NDK排错指南”。正文问题1:QT 无法在android环境下导出事件循环,导致信号槽无法
2020-06-04 11:16:55
27492
2

原创 NDK撩妹三部曲(二)—论“Android 实战如何使用 C++ so 库这个神秘武器?”之带妹实战篇
NDK撩妹三部曲(二)——论“Android 实战如何使用 C++(Qt) so 库这个神秘武器?”之带妹实战篇从何说起? 上礼拜在妹子面前秀了一波后,妹子事后频频要请我喝奶茶,还说我明明可以靠脸吃饭,却偏偏要靠才华(我淦,内外兼修才是我追求的终极奥义)。坚持了3天,终于抵挡不住妹子的热情,当然,妥协是因为饥渴,不对,是因为奶茶,还不对,不是因为奶茶,而是本着助人为乐,共同学习,分享快乐的宗旨,献上我宝贵的“NDK”宝典。拂去1cm厚的灰尘,翻到,328页,对,就是这儿,“论 Android 实战如何
2020-06-03 14:50:19
28281
4

原创 NDK撩妹三部曲(一)—站住同学,我这有个C++的so库,底层运算效率飞起,想不想要?
NDK撩妹三部曲——站住同学,我这有个C++的so库,底层运算效率飞起,想不想要?从何说起? 前段时间,公司有个前端妹子找到我说:“Q哥,我想把我们项目的部分公共业务逻辑提取出来…”,话还没说完就被我打断了。“嗯,挺好的,抽个公共类吧”,我故作镇定的说道。“不是的,我想要…让你帮我用C++写一套,以后就能不区分平台的使用了嘛,你就帮帮我啪”,艹,打错了,是”吧“。咳咳,终于,妹子还是露出了本性。呵,女人! 算了,本着助人为乐的态度(主要还不是看长相),Q哥我决定帮助妹子实现这个伟大的愿望。欠揍,
2020-05-25 22:10:35
1562
5

原创 QT插件学习系列(四) linux下试运行
QT插件学习系列(四) linux下试运行关于第一篇文章 QT插件学习系列(一) 初识QtPlugin 末尾提到的 linux 下的测试结果,因为 QT 代码一次编写,跨平台运行,因此我们的 Demo 在 linux下是通用的,下图是运行和测试结果(QTCreator 4.8 ubuntu 18.04):代码我没有做任何改动,可以看到,插件被正确加载,动态库也正确生成。关于 linux...
2019-06-03 17:23:16
1287
6

原创 QT插件学习系列(三) 插件间通信
QT插件学习系列(三) 插件间通信1、 概述前两篇文章学完我们可以从0开始写一个 QT 插件了,也有自己的简易版插件框架了。但是例子中只给出了单个插件的加载与调用,我们实现插件化的目的是为了扩展性,实际项目中会存在插件A,插件B,插件C。而这些插件之间怎么通信 ? 或者说怎么建立一种良好的通信结构,这既是一项必不可少的工作,更是完善我们插件框架的重要里程碑。在我们实现通信机制的时候,要考虑下...
2019-06-01 21:37:01
31999
16

原创 QT插件学习系列(二) 插件管理器
QT插件学习系列(二) 插件管理器1、 概述上文中展示了一个简单的 QT Low-API 插件实例,但是这却满足不了大型应用程序的实际场景,没有扩展性。而插件间的通信、加载卸载(释放内存)、插件元数据、插件生命周期、插件依赖等问题,便是我们要做的。在QT内部,高级 API 有 PluginManager 负责做这些事,但是低级 API 就需要自己写插件管理器来帮助我们解决这些问题。想象一台 ...
2019-06-01 21:32:12
3603
6

原创 QT插件学习系列(一) 初识QtPlugin
QT插件学习系列(一) 初识QtPlugin1、 概述为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢?导出的动态库如果缺失,程序不能运行。但插件可以。同一套代码,即可分别在 windows 下和 linux 下生成插件。QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的...
2019-06-01 21:30:18
28626
5

原创 手把手教你实现折线图之------安卓最好用的图表库hellocharts之最详细的使用介绍
因为项目需要搞一个折线图,按照日期显示相应的成绩,所以有了本文。 以前用过一次XCL-chart,但是感觉只适合固定图表,不去滑动的那种,因为你一滑动太卡了你懂得(毕竟作者好久没更新优化了),拙言大神我开玩笑的 ,毕竟我加你的群大半年了 - -第二研究了一下achartenginee图表框架,一不美观,二 achartenginee的可定制性实在不敢恭维,做出来的图表根本不能满足需求再试了一次
2016-05-26 11:28:20
61039
65
原创 bcf的设计思想
bcf目前只支持"头部指定长度"协议。在我看来,大多数场景下使用这种协议就够用了。他没有定长协议的缺点,支持动态长度。,这个变种接近于"头部指定长度"协议,只是将cmd拆分为了2个字段(为了定义更复杂的业务),将body的内容用json格式代替。演示了如何使用协议model进行tcp通信。
2024-10-24 09:11:00
756
原创 【开源项目】bcf,一个好用的客户端协议通信框架
分享一个自己最近写的开源库,本来的目的是服务于我们组,方便开发中小型客户端软件的。名字叫bcf,是一个适用于客户端的协议通信框架。
2024-09-03 10:30:41
627
原创 关于linux下实现一个QT悬浮窗要注意的地方
之前被设置,且 setWindowOpacity 一定要在 setWindowFlags(windowFlags() | Qt::Window);之后设置,所以我们在 setPacity 函数的第一行取消 windowflags 后和在倒数第二行有重新设置回去,这样才能保证鼠标透传和透明度均能生效。一般情况下我们想实现一个悬浮窗或者小部件,要求透传鼠标事件,且在大于给定的透明度时又需要拦截鼠标事件,这个悬浮窗当然也要支持透明度设置。有时候透明度设置可以生效但是鼠标又无法透传。
2024-04-19 17:02:54
416
原创 cmake 实用小技巧
第一步:在cmake开始时设置,让编译出来的动态库不要将编译时路径添加到RPATH中。第二步:在 add_library 之后,target_link_libraries 之前,设置下面的属性,让当前动态库查找依赖库时从 …/lib或者./lib查找。这样哪怕有多级依赖,最后我们打包可执行程序时,只需要将所有的动态库放到lib目录,可执行程序放到bin目录即可(可选)。–disable-new-dtags 的作用是不要使用run-path,统一使用rpath。configure 方式设置rpath有时候
2024-04-12 12:21:18
1531
原创 CPU核心数、线程数都是什么意思?
但是,我们要注意的是,一个cpu分成多个内核,这是物理的分隔,拆开cpu是可以看到的;但是一个内核被分成两个线程是一种超线程技术,操作系统会认为一个线程也是一个内核,有点欺骗操作系统的感觉。为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出现了多核 cpu,这样一个多核 cpu 就是同一时刻能够运行多个进程/线程的。2个物理cpu,每个cpu 16核,每个核2个线程,所以总共64个线程(处理器)。如上图其实就是假4核,其实是2核4线程。
2024-04-12 12:19:26
642
原创 linux网线正常,但没有网络,ifconfig没有ip地址
今天正在用着好好的,不知道为什么突然没有网络了,网线灯也不亮,ifconfig只有lo回环地址。因为装的双系统,切换到windows环境发现网络是正常的。
2024-03-20 10:20:36
1999
原创 关于《opencl编程指南》一书的错误
不等于图2中代码计算得到的值27,则证明书中的图中的6x6输出是不正确的,此处进行记录勘误。当然这是我刚开始学习OpenCL,我记录的最大目的是希望大家帮我指出来我的理解有误。如果认为书中右侧输出数据只是矩阵按主对角线翻转了,也是不对的。而上图书中的输出是不正确的。
2024-03-12 15:45:43
421
原创 linux下如何hook第三方播放器的视频数据?
在linux下,我们使用LD_PRELOAD环境变量,利用此变量提供的hook能力去拦截目标程序所要调用的ffmpeg关键函数,如果需要解码前数据,那就拦截解封装函数。如果需要解码后数据,那就拦截解码函数。在拦截的函数中,我们添加自己的写文件操作,将两部分数据写到本地文件中即可。关于如何使用LD_PRELOAD 劫持函数,可自查用法。关注公众号:QTShared,免费阅读更多文章,免费获取源码。方法论不一定局限于ffmpeg,也可以应用到比如gstreamer等播放框架中。
2024-03-11 09:48:57
249
原创 【超级干货】播放器核心知识点-音视频同步原理深入剖析
本文在反复理解的基础上顺便对网上的一些不正确的解释和说法进行了勘误,对模糊的地方进行了澄清,基本上示例中的每一行代码为什么这么写,它的依据是什么都有明确的解释。完整源码链接:https://gitpub.sietium.com/bridge/ffsync。
2024-03-11 09:47:10
442
1
原创 摄像头拉流低延迟(90ms内)实践和技术讲解
当然有。从摄像头相关领域专业人员了解到,目前端到端网络摄像头的延迟基本为90ms左右。而本文使用的技术方法就可以让延迟降低到稳定的90ms内。首先我们来分析下摄像头从拉流到渲染出来的链路,然后我们预估一个耗时情况。从上图可以看到,假设我们是30fps的摄像头,则端到端的理论延迟数据应该在80ms左右。虽然这只只是一个粗估值,但至少让我们知道底线在哪里。蓝色框的处理是摄像头本身的处理耗时,我们无法干预。绿色框我们可以干预一部分,比如优化网络,优化rtsp接收。
2024-03-05 17:20:16
1993
原创 ffmpeg使用vaapi解码后的视频如何基于x11或EGL实现0-copy渲染?
VADisPlay对象比较重要,使用vaapi硬解码,ffmpeg要求我们必须将申请的vadisplay指针赋值给AVCodecContext中的hw_device_ctx的hwctx的display,否则在后面是无法得到有效的vasurfaceID。唯一有点关系的是在初始化egl时因为我们要显示到一个可见的窗口中,所以使用eglCreateWindowSurface函数时需要一个X11 window(在流程图的①处我们已经通过XCreateWindow创建了一个),并将其指针作为egl的渲染目标窗口。
2024-03-05 17:10:57
1031
原创 RTP timestamp与帧率及时钟频率的关系
RTP timestamp表示每帧的时间,由于一个帧(如I帧)可能被分成多个RTP包,所以多个相同帧的RTP timestamp相等。(可以通过每帧最后一个RTP的marker标志区别帧,但最可靠的方法是查看相同RTP timestamp包为同一帧。其时钟频率为90000(通常视频的时钟频率),若视频帧率为25fps,则相邻帧间RTP timestamp增量值 = 90000/25 = 3600。RTP timestamp是用时钟频率(clock rate)计算而来表示时间的。
2024-01-10 14:58:45
324
原创 (独白)我为什么选择了计算机行业?
那个时候我们教研室的同一级的一个女生对我有一句评价:突飞猛进,虽然感觉说出来有点不要脸,但是说实话,从进入教研室开始时啥都不懂的小白成长到独立完成商业APP从需求沟通到开发联调到交付整个环节的程度,那个时候也会android自定义view,也经常阅读源码,分析源码,玩github,玩csdn写博客,也算中级程序员中的高级了吧。这个世界变化很快,10年前的土木是黄金专业,可能在10年后,计算机专业也是排名倒数的专业(就今年来看,计算机的就业形势已经非常严峻了,再加上各种裁员潮,说哀鸿遍野也不为过)。
2023-12-15 19:08:21
1628
原创 C++调用openssl实现国标sm2签名算法的使用
因为国产化原因,项目中需要使用国标sm2签名算法对文件进行签名和验签。OpenSSL 1.1.1版本提供了对国密SM2算法的支持,在之前的版本openssl不支持,所以大部分都采用开源库 gmssl。gmssl3已经脱离了openssl的依赖,现在是一个比较小的支持国密算法和ssl协议的三方库。关于gmssl的使用可以参考它的源码链接,还是比较简单的,但是本文没有使用gmssl,而是使用openssl1.1.1版本中的sm2的支持。
2023-12-13 18:05:22
3815
3
原创 使用QT基于YMODEM协议实现串口文件发送(和xshell互通)
YMODEM协议是一个文件传输协议,常用于嵌入式设备。本文不对YMODEM做过多的阐述,阅读需建立在你已经对YMODEM有一定了解的基础上。Ymodem 协议详解YMODEM协议简介YMODEM协议中文翻译但要注意的是这些文章都有一些小的细节性的错误,文章的评论区有人指出了,需要注意甄别。发送端----------------------------------------------------------------接收端。
2023-12-13 16:59:03
1787
2
原创 惊喜!C++ 现代化json库nlohmann更高效的使用方式
nlohmann 这个库其实早在2019年项目中已经开始使用了,没有问题,这些库一般都不会进行升级。最近在新的项目中也需要用Json解析,然后再去它的官网上过了一遍ReadMe,发现了一些提高效率的新功能。链接: 也提到了,感兴趣的可以看看)。这种方法的优点是可以自己控制每个字段,比如字段名和结构体成员变量名可以不同,字段解析时可以增加自己的处理逻辑等等。但对于90%的使用场景来说,只想要一个简单的结构体解析,上面的方法就显得特别的繁琐。
2023-12-12 20:53:05
1527
原创 【建议收藏】QT实现字符串和枚举的相互转换,从源码角度分析实现原理
QT中实现字符串和枚举的转换主要是利用Qt的元对象机制。类必须继承于QObject并使用Q_OBJECT宏;类内添加枚举,使用Q_ENUM宏将枚举注册到元对象系统中;
2023-12-12 17:00:03
2024
原创 用 QPlainTextEdit 实现一个日志控制台(带源码)
2、在段落布局上,QPlainTextEdit 的性能是高于QTextEdit的,我这边是测试验证过的,在大量数据的时候,QPlainTextEdit 在dockwidget中进行拖动就不会卡顿,而QTextEdit卡顿非常严重。由于我们的程序在使用时,在进行串口通信或者网络通信时,想实时的看到关键日志信息或者错误信息,所以需要在软件中集成一个日志控制台的功能。此widget可以当作一个基础的UI组件,可被QT程序加载到任何想显示的布局里面,比如添加到dockwidget中可被拖动。
2023-12-11 14:49:58
944
原创 lambda技巧之—如何在有多个判断分支的情况下,还能优雅的使用auto& ?
很无奈的情况下我们必须将 auto& 退化成指针,本来简单的 clazz.a 的引用也要变成 &clazz.a ,且操作符 “.” 也要变成"->“,此时不知道屏幕前的你是否也感受到了一点代码的"臭味道”。C11的写法中,decltype 可以根据捕获参数 clazz 推导出此lambda的返回值类型,而如果使用C14即以上,lambda返回值直接使用auto&就行了。Perfect,得益于 IIFE 的好处,我们幸运的保留的 auto& student的写法,而不用再改成丑陋的指针了。
2023-12-08 11:00:19
419
原创 QxOrm 如何自定义主键?
例如,要为 myClass C++ 类定义 QString 主键(映射到具有 VARCHAR 类型的列主键的数据库表),必须编写: QX_REGISTER_PRIMARY_KEY(myClass, QString)警告:QX_REGISTER_PRIMARY_KEY宏必须在类定义中的QX_REGISTER_HPP宏之前使用,否则会发生编译错误。可以使用QX_REGISTER_PRIMARY_KEY宏定义另一种类型(例如,QString 类型)的唯一 id(主键)。
2023-12-07 11:19:17
668
PluginApp3.rar
2019-05-30
PluginApp2.rar
2019-05-29
VLC及依赖库,包含32位和64位
2018-11-10
IM-QTCPSocket通信软件
2018-09-10
sm2+openssl.zip 使用C++实现的openssl调用sm2实现文件签名的功能 C++源代代码可以直接使用
2023-12-14
QT实现的YMODEM 传输上位机,和xshell互通,兼容了不规范的YMODEM协议
2023-12-13
基于 QT 实现一个串口命令行工具(源码),perfect!
2023-12-11
qxorm,依赖于QT的强大的ORM库,从此不再手写sql
2023-12-07
android 卡死崩溃检测和拉起,App保活
2021-01-04
DH_VIDEO_demo.rar
2020-07-07
DH-RealPlay.rar
2020-07-01
dbus-1.13.10.tar.xz
2020-06-03
glibc2-27.tar
2020-06-03
soTest.rar
2020-05-25
QTcpSocket SLL加密Demo(包含客户端和服务端,QTCreator项目).rar
2019-06-27
QtWebsocket SLL加密通信Demo(包含客户端和服务端 QTcreator项目).rar
2019-06-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人