Qt
文章平均质量分 84
介绍Qt在各类场景中应用的例子。
丁劲犇
眼花了,再写两年博客准备送给儿子了。
展开
-
基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现
准静态自适应环形缓存器(Quasi-Static Adaptive Ring Cache)是taskBus用于数据吞吐的软件技术。使用该缓存器,基于EPDR的业余软线无线电平台taskBus可在Linux 系统 i7 6700K 4GHz下达到3GBps(24Gbps)的总交换能力。该交换能力被各个通道均分,共同支撑taskBus平台按照工程的连接关系,把各个生产者产出的数据包及时、完整、有序地输送给消费者。当然,这种架构存在木桶效应,且仍旧距离挑战吞吐能力极限有很大距离。原创 2024-09-08 20:26:34 · 1024 阅读 · 1 评论 -
taskBus的设计局限和吞吐能力测试
在前文中,我们介绍了EPDR,以及使用该技术驱动的taskBus。已有玩家通过踩坑证明,进程管道交换数据时间延迟大,构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度,否则很难在期望的时刻执行正确的动作。为了不给读者造成困扰和不必要的尝试,通过此文明确这个技术以及相应平台的局限,并给出可能满足上述需求的解决构想。经过测试,最佳成绩在 i7-10700U 笔记本上达到,整体吞吐3GBps,单路1.2GBps,平均延迟2ms。原创 2024-08-23 11:35:54 · 1108 阅读 · 1 评论 -
为taskBus业余软件无线电平台完善自启动和自动运行功能
taskBus是一款我和朋友们一起开发的业余软件无线电平台。因为很懒,一直以来,运行一个tbj文件,都需要打开、运行这些步骤。若要自动运行,需要依靠命令行模式的 taskbusConsole来执行。其实,想要GUI程序通过命令行打开文件,也是最基础的操作。但是这个功能竟然一直都没有实现。今天,就来实现一下。原创 2024-07-19 10:10:12 · 1028 阅读 · 0 评论 -
使用RTL-SDR及USRP B210在业余软件无线电平台taskBus绘制船舶AIS广播
在业余软件无线电领域,比较入门的玩家也能通过等成品软件收听广播、接收飞机、船舶的位置。但是,这些软件对具体的算法的封装往往很深,编译起来依赖项巨多,让我们搞不清楚究竟是怎么实现的。本文通过改造两个C/C++开源代码,基于Qt的自建业余软件无线电软件taskBus和自建的地图引擎qplanetosm实现从波形接收到地图绘制的全栈流程。在河道进行测试,可以顺利接收小船的AIS。原创 2024-07-01 09:15:00 · 786 阅读 · 0 评论 -
编写工具调用windeployqt+ldd为msys2 Qt应用程序生成完整发布包
在msys2环境下,想找齐Qt程序依赖的库非常繁琐。本文开发一个Qt工具,在msys2开发模式下,帮助程序员快速生成一个绿色版的完整发布包。该工具首先调用windeployqt找齐Qt的直接依赖,而后递归调用ldd,为每个库找齐依赖树。使用该工具,可以立即发布绿色版的msys2应用包。原创 2024-06-17 10:45:00 · 1028 阅读 · 0 评论 -
使用 MSYS2 Qt6 发布绿色版的SDR软件无线电应用
当您使用Qt创建Windows应用程序时,您通常需要将一些Qt库和其他依赖项打包到您的应用程序中,以确保在其他计算机上运行时具有所需的依赖项。由于特别喜欢路径无关的绿色软件,自己总想着找个办法,使得SDR程序拷贝到一个崭新的计算机上直接可以点开运行,并驱动我的山寨USRP B205mini。本文介绍实现这一技术的思路和细节。原创 2024-05-10 10:30:00 · 2223 阅读 · 0 评论 -
解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障
MSYS2 升级到 Qt6.7.0,发现显示故障,所有Qt6程序以及 QtCreator的SpinBox都显示不全,Combox的底色不对。使用Qt的命令行选项--style fusion 可以选择其他主体暂时绕过该 BUG原创 2024-04-13 19:33:21 · 576 阅读 · 0 评论 -
开源玩具总动员-本博客的知识关系图
作为一个非全职编程爱好者,基本是把计算机周边当做高档大玩具来玩的,顺便带着有兴趣的学生搞一搞学习。这篇文章作为全站的一个导航篇,把本博客的主干要点汇聚一下。原创 2024-03-06 20:56:19 · 1016 阅读 · 1 评论 -
使用 C++23 协程实现第一个 co_yield 同步风格调用接口--Qt计算排列组合
在C++23的协程特性里, co_yield 用于从协程执行过程中返回值。这个功能乍一听起来很奇怪,网上的例子大多是用一个计数器来演示多次中断协程函数,返回顺序的计数值。这看起来毫无意义。其实这个功能主要想演示的就是协程 co_yield 具备打断一个函数的执行,并多次返回值的能力。这种能力允许实现一种隐式状态机,每次使用时,返回下一个状态。这对于极为复杂的状态计算来说,是很有用的。它(协程)避免了显式的设置状态记忆句柄,大大简化了实现难度。原创 2024-02-26 06:50:25 · 685 阅读 · 0 评论 -
使用 C++23 协程实现第一个 co_await 同步风格调用接口--Qt计算文件哈希值
C++加入了协程 coroutine的特性,一直没有动手实现过。看了网上很多文章,已经了解了协程作为“可被中断和恢复的函数”的一系列特点。在学习过程中,我发现大多数网上的例子,要不就是在main()函数的控制台程序里演示yeild,await, resume的特性,要不就是讲述很多概念,很少有演示协程究竟如何把异步变成同步调用的。本次,我们就通过一个简单的计算文件哈希值的例子,来演示如何进行协程操作。原创 2024-02-22 13:15:02 · 1438 阅读 · 0 评论 -
QCoro: Qt C++ 20 协程库介绍
C++20 推出了协程的实现(协程是一种线程内的快速执行序切换功能,比回调函数调用起来要简单。是 Qt 的一个协程库,利用C++20的特性,可以显著简化以前用信号-槽回调才能完成的操作。代码可从下载。原创 2024-02-03 19:24:46 · 2709 阅读 · 2 评论 -
Qt Desktop Widgets 控件绘图原理逐步分析拆解
Qt的一个风格按钮的点线面是如何绘制到屏幕上的呢?我们通过详细阅读Qt6.6源码,感受一下Qt从0开始做轮子的绘图过程。这种实现完全可以作为操作系统的GUI部分而存在,正如Qt本就是KDE桌面的基础工具链。原创 2023-12-10 20:52:57 · 542 阅读 · 2 评论 -
使用MSYS2的静态Qt版本进行Widgets项目编译时需要注意的问题
需要编译一个静态版本的应用程序,并用upx进行压缩,以便减少携带的动态链接库,生成每个文件不超过10MB的轻量级绿色发布包。使用动态库不利于发布。准备发布的环境,是学校的教学中心的学生计算机。学生计算机的每一台机器都可能安装有不同版本的Qt,且时常污染环境变量(PATH),导致链接了其他版本Qt的程序启动时遇到问题。不能为每一种Qt发布包编译一个发行版。本文介绍使用msys2编译静态Qt6程序的注意事项。原创 2023-10-29 14:39:36 · 530 阅读 · 0 评论 -
Qt Signals & Slots VS QEvents - Qt跨线程异步操作性能测试与选取建议
Qt跨线程异步消息用信号-槽还是Event?他们与直接函数调用的性能比较如何?我们通过对taskBus实时性改造中遇到的测试进行讲解,对比信号-槽与事件机制在多线程POSTMsg上的性能差异。尤其是范例代码对1-多、多-1的信号-槽连接分别进行测试。测试发现,事件调用的开销与单线程直接调用几乎一样。单点信号-槽调用性能是直接调用的50~80%左右,若槽很多,则性能直线下降。原创 2023-10-23 21:54:25 · 381 阅读 · 0 评论 -
避免滥用Qt信号与槽——改进taskBus 平台以吞吐20M IQ采样带宽
软件无线电平台是一款依靠 stdin-stdout进行数据吞吐的教学平台。在平台创建之初,主要使用 RTL-SDR进行简单的窄带接收应用,并没有考虑采样率超过1.8M的情况。引入 USRP B210/B205mini后,采样率瞬间提高到2M以上,此时,使用信号与槽进行吞吐时,性能问题就暴露无遗了。本文详细介绍如何该平台的实现问题,以及补救策略。补救后,双路可直接吞吐20MHz采样率的16bit IQ信号。2024年,经过专门测试,理想吞吐率在i7处理器上达到3GBps,文章尾部含有链接。原创 2023-06-24 20:33:52 · 1414 阅读 · 0 评论 -
基于Qt WebEngine 的Web仪器面板GUI程控技术
随着IIoT的发展,很多工业仪器也具备了远程管理的GUI。与早期使用串口进行命令交互不同,这些GUI可以直接在远程呈现数据。作为希望对仪器、软件进行二次开发的小公司来说,会遇到GUI人工操作转自动化的需求。在无法通过串口等传统接口进行自动操作的情况下,就只能考虑GUI自动化。在现场工程师领域,常见的GUI自动化程控技术主要分native界面与Web界面两类。用QtWebEngine可以非常从容地应对Web GUI自动化。原创 2023-03-09 13:47:49 · 2219 阅读 · 0 评论 -
现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN IIoT联测
在传统制造业、互联网,以及所有和工程相关的领域,都会生长着一类非常硬核的攻城狮。他们不仅是行业全栈工程师,又具有非常丰富的现场经验——编程、电气、电子、万用表、电烙铁都能来上两招。具备这种“急诊医生”能力的技术人员,有正规的定义,叫做“现场工程师”。本案例就介绍现场工程师的应变,通过PCAPHub与云虚拟机,实现甲方、乙方异地交换机的逻辑直通。在文章的最后,还会讨论现场工程师的能力与素质。原创 2023-01-20 13:52:31 · 1235 阅读 · 0 评论 -
EthernetOnTCP--基于Qt QSslSocket 套接字在PCAP 集线器上实现以太网隧道
我们使用PCAP建立了本地的软件集线器(Hub)。考虑到较远距离的跨车间调试,有必要使用Tcp连接构造一个以太网的隧道,使得两个车间之间的调试设备可以虚拟的连接在一个Hub上。使用QSslSocket可以方便的实现这个功能。同时,通过控制回放的范围,可以精确控制PCAPHub工作在交换机-集线器的混合模式下。原创 2023-01-14 17:18:53 · 1001 阅读 · 2 评论 -
基于PCAP搭建软HUB实现物联网在线调试
在调试嵌入式物联设备时,尤其是在多个以太网物联设备交错通信的情况下,很难通过在捉襟见肘的嵌入式系统上进行数据记录与调试。如果设备连接的是交换机,在空闲端口是无法看到所有其他端口上的数据的(广播除外)。PCAPHub基于PCAP,构建了一个软集线器。进行调试时,把待调试的工业设备从工业交换机断开,并临时接入在调试工作站的网卡上。这样,就可以用Wireshark抓到所有参与调试的设备数据。原创 2023-01-09 07:45:00 · 908 阅读 · 0 评论 -
你好2023-使用msys64 openssl 制作QSslSocket实验所需证书
2023年开始了,第一篇,记录最近帮朋友制作QSslSocket所需证书的过程。使用传统的TCP连接依旧是很多工业软件的常见通信方法。但如果恰好不希望别人通过抓包等方法研究上位机和控制器模块之间的协议格式,那使用SSL连接是一种掩耳盗铃的好办法,能够抵御不是很执着的逆向行为。SSL一般可以通过openssl实现,这样即使是嵌入式设备里也有类似的支持。QSslSocket非常平顺的保留了所有的易用性,让一般的硬件作坊也能碰一碰SSL和网络编程。原创 2023-01-01 09:55:29 · 914 阅读 · 0 评论 -
使用 Qt for Android 获取并利用手机传感器数据(下篇)使用C++实现功能
在上一篇,我们搭建了开发环境。本篇,使用C++代码真正实现Android功能。我们使用UDP协议从手机上指定发送的目的地、端口。我们建立一个Qt的Widgets程序,添加 position, sensors模块。枚举传感器并建立界面,通过Qt的Sensors可以枚举到传感器的取值。原创 2022-12-03 17:58:41 · 3041 阅读 · 4 评论 -
使用 Qt for Android 获取并利用手机传感器数据(上篇)开发环境省心搭建
现代手机拥有许多传感器,包括地磁、姿态、GPS、光照、温度、气压、摄像、声音、电磁等,完全就是一个高度集成的科学仪器。不夸张的说,一部手机加上一个外围的计算机和控制系统,做一个功能较强的自主移动机器人并不是不可能。但是,很多APP都只是局限于自身的功能,并不喜欢把传感器数据泵出来给其他设备分享。即使有,也是收费的。有没有可能自己做一个小APP,获得所有的手机传感器数据,榨干手机的感知能力呢?实际上实现起来并不困难,甚至连界面都不需要。笔者准备涉足一下从未实操过的App开发,把旧手机的传感器数据分享出来。原创 2022-12-01 21:59:20 · 4139 阅读 · 8 评论 -
使用Qt轻量的QTextBrowser为taskBus SDR显示丰富的图文帮助
最近准备为软件无线电平台添加集成文档功能。毕竟模块变多了之后,简单一页纸的小文档对正确想起来如何使用模块功能意义很大。对于一款极简的轻量级SDR产品,我们希望taskBus的文档继续保持极简的风格,支持txt纯文本、简易Markdown和本地html。QTextBrowser是一款轻量但强大的本地富文本显示控件,本文介绍这种控件在帮助文档浏览中的运用。原创 2022-11-05 19:39:48 · 1862 阅读 · 0 评论 -
使用C语言+USRP B210从零开始实现无线通信(1) 基本情况介绍
近期,有同学成功使用taskBus进行AM/FM广播的收发,并提出了问题:有没有可能简单几步就实现数据传输呢?答案是肯定的。只要能传声音,那一定能传数据。不但如此,如果不考虑带宽、效率,在稳定的实验室环境下,实现起来很简单。本系列文章,我们带大家抛开GNURadio里现成的通信模块(如GSM),从零开始,一句句构造最简无线网络,实现双向数据互通。原创 2022-09-06 10:15:00 · 2610 阅读 · 0 评论 -
谁删了服务器?谈VC源码字符集和回车换行注意事项
在Windows Visual C/C++编程时,经常需要从Github或者其他既有项目中“借鉴”(呵呵哒)一些代码过来。这个时候,就要格外注意字符集和回车换行带来的编译问题。这类编译问题造成的错误千奇百怪,可能在编译时、链接时,甚至运行时造成困扰。尤其是运行时,很难发现,在极其倒霉的时候,会造成删库跑路或者惨痛的事故。原创 2022-08-24 21:35:39 · 574 阅读 · 0 评论 -
使用MSYS2和UPX显著缩小发布文件体积
对于经常发布桌面应用程序的攻城狮而言,当然希望自己的程序只要一个可执行文件,拷贝到任何位置直接双击就能运行啦。比如笔者,经常使用MSYS2 里的mingw64 Qt静态编译程序,以便只要一个可执行文件就能到处运行。以前,我用MFC静态编译很香。换成Qt后,感觉静态编译出来的程序,体积出乎意料的大,有的一个EXE文件就有20MB。用了UPX后,可以获得20%的高压缩率!...原创 2022-08-18 23:42:03 · 396 阅读 · 0 评论 -
【已解决】MSYS2 QtCreator Clangd 代码分析找不到 mm_malloc.h的问题补救
近期学校的机房里升级了msys2,遇到了QtCreator的代码提示"In include file : 'mm_malloc.h' file not found"问题,不算完全解决,因为要上课,采用了临时的补救方法。原创 2022-07-30 19:50:44 · 1338 阅读 · 1 评论 -
机器学习小试(11)验证码识别测试-使用Qt与Tensorflow2进行深度学习实验
由于非常熟悉nativeC开发,学习Python的过程中还老是忘不了Qt,准备用Qt产生训练样本。而后,使用Qt的GUI在后台调用python进行实验。实验使用Tensorflow2 可以有效的识别生成的验证码的文字。原创 2022-07-22 10:44:42 · 1099 阅读 · 0 评论 -
机器学习小试(10)使用Qt与Tensorflow创建CNN/FNN测试环境
继续介绍使用Qt+Python搭建简单但灵活的CNN实验工具神经网络的思路和方法。实验工具神经网络,使得可以迅速读取自定义的训练数据,并验证AI在当前需求场景下的区分度和可用性。原创 2022-07-21 22:28:04 · 1000 阅读 · 0 评论 -
避坑必看:C++移植C语言结构体char短整形导致生产事故分析
C++中直接使用C语言短整形结构体成员时,要注意很多短整形的实际类型为char.如果错误的利用自动类型函数重载完成字符转换,存在把短整形ASCII化的潜在隐患。本例子是一次现实生产事故的简化介绍。.........原创 2022-06-30 20:26:56 · 600 阅读 · 1 评论 -
极致敏捷-使用C语言在Taskbus中一天实现ADS-B接收机和实时飞行地图
我们如何用一天时间,把毫不相干的2个工程整合在一起,形成对ADS-B飞机航迹的实时接收、显示呢?答案是使用管道技术。taskBus轻量级管道总线,使得我们非常迅速的完成了开源代码、团队历史代码能力的迁移,构造出无需python\html\web的实时ADS-B接收机。项目在Linux, win10下测试通过,同时提供发行版,理论上可以直接在具备USRP B210的计算机是运行。但重要的不是项目本身,而是基于管道构造敏捷开发平台的思维。这种思维对迅速整合能力有非常关键的意义。......原创 2022-04-28 13:48:43 · 1831 阅读 · 7 评论 -
Qt lambda槽在跨进程功能发现与参数同步中的应用
Qt 5 和 Qt 6 在引入 lambda 槽后,对动态创建控件提供了更多的方便。背景taskBus软件无线电平台使用一种多进程原创 2022-04-26 19:11:30 · 1025 阅读 · 3 评论 -
50行实现C语言FM收音机-Taskbus Stdio封装器在SDR课程中的应用
本文介绍了一种仅用C语言本科教材的知识,就能参与完成实时SDR接收实验的方法。该方法用于教学实验,显著提高了学生的参与度。学生感受到,如此简单的一个小程序,就能参与到一架FM收音机的实时播音中去,并深刻了解自己所做的程序在完整处理流程中的作用。通过不断替换模块,学生可以逐步深入,直到实现完整的收音机SDR模型。通过C语言的信号处理,能够避免SDR实验课中对GNURadio嵌套调用过程追溯给普通学生带来的困扰。...原创 2022-04-19 15:51:04 · 2386 阅读 · 2 评论 -
特性提醒-Qt6录音QIODevice::readAll()返回奇数字节。
主要的问题:我在一个项目中使用QMultiMedia模块录音,假设了 QIODevice::readAll() 每次必然返回整数组样点。比如立体声,16位,则返回的字节数必然是4的整数倍。这个行为从Qt4、Qt5都没有出问题。结果Qt6时,在Win10下返回了奇数个字节。如果不做缓存,后续的样点字节就被破坏,声音就很怪很怪。我已经在Qt的社区反馈了这个问题:A noteworthy issue: QAudioSource returns a QIODevice object, whose QIODev原创 2022-04-16 12:48:40 · 3031 阅读 · 1 评论 -
QtCreator对CMake的支持与局限-CMake快速上手小记
通过近期对QtCreator、CMake的试用,已经把现有的两组较为完备的项目迁移到CMake。在试用期间,还是遇到了一些坑,也对CMake的套路有了一些基本的认识。本文介绍通过在QtCreator下新建空项目,获得CMakeLists.txt模板的开始方法。围绕CMake变量表的获取与查看,介绍如何快速用变量表完成判断。评价目前Qt CMake与IDE的一些特点。CMake与QMake的工程对照见我的工程taskBus和qplanetosm。1. 快速开始一次迁移1.1 从模板开始对于原创 2022-04-14 22:32:24 · 3952 阅读 · 3 评论 -
从QMake到CMake-带有插件与ActiveX的Qt .pro工程向MSYS2-CMake移植实验
鉴于 Qt6 已经选择了CMake作为基本的源码编译工具,看来我们不得不好好熟悉一下CMake的用法了。从网上和Qt新建工程的模板出发,花了3天时间,基本熟悉了CMake的语法和原理,并成功用笔者的一个OpenStreetMap客户端工程作为实验,为其添加了CMake支持。本文主要介绍一下迁移的基本过程,以及注意事项,最后,会进行一个小的总结。该工程在我的博文中有详细描述,完成迁移的项目可以参考源码https://gitcode.net/coloreaglestdio/qplanetosm...原创 2022-04-05 19:22:02 · 2745 阅读 · 1 评论 -
MSYS2显著简化Kafka在windows C++下的使用门槛
熟悉FPGA硬件和实时软件开发的团队,一般对消息队列等中间件不是很熟悉。在以前的各类应用中,主要只涉及FPGA/DSP和上位机之间通信,团队积累了不少“点到点”高速吞吐+双向水位控制代码。因此,即使遇到PC之间的交互,也习惯使用自定义的TCP、UDP协议搞定一切。但此单合同涉及的后续处理流程十分复杂,需要涉及多个独立的可伸缩节点,以及适应未来部署后用户的二次扩展应用。为了避免用户接触过多的底层协议,并降低伸缩节点带来的配置文件修改维护耦合度, 我们新进的软件部负责人建议公司尝试用消息队列取代传统的UDP/原创 2022-04-02 23:20:31 · 3976 阅读 · 2 评论 -
程序猿的口味-从C++STL聊到MSYS2-Qt
一直以来,我在教授C++语言编程课程的时候,总是在泛型上慌得很,生怕自己的半吊子C++知识贻笑大方。还好我发现同学们和我一样都是糊涂虫,只满足于把STL的容器和算法当作简单类型用就完了。印象深刻的一次尴尬就是学生问我:丁老师,怎么你给的例子的链表,和std::list的链表差别这么大,学了泛型,怎么还是看不懂STL库的代码呢?我只能说,师傅领进门,修行靠个人,我也不懂哩!其实老师眼都看花了,也是看不懂。通过20年的教学,我悲哀的发现一个事实:哪怕学完一本教材,让我实现一个链表或者字典,也绝对不会长得像ST原创 2022-03-19 23:10:32 · 6520 阅读 · 2 评论 -
现场工程师大晒:使用 ImDisk 与 junction 显著提高机械盘阵高并发吞吐性能
近期,协助朋友公司调优了一个奇葩的系统。由于盲目扩充规模,导致基于松散文件接口的多进程机械盘阵高并发计算性能下降,无法实时处理。虽然没有源码,但通过现场工程师的一顿操作猛如虎,联合 ImDisk内存磁盘、junction NTFS 文件夹链接、现场开发Qt配额控制、强制解除占用句柄,多管齐下,在24小时内完成了系统部署。原创 2021-12-23 21:52:12 · 1503 阅读 · 5 评论 -
Qt 6采用cmake替代qmake构建Qt
最近阅读了官方论坛的几个文章CMake is the build system for Qt 6Qt and CMake: The Past, the Present and the FutureBuild System Changes in Qt 6可以肯定的是为了支撑Qt EVERYWHERE 的愿景,找到一个跨平台的构建工具已经伤透了开发团队的脑筋。采用CMake应该是理智而无奈的选择。首先,推动这个想法的最大需求,就是编译Qt本身的复杂性。几个文章主要讨论的是编译Qt库不用qmake而用c原创 2021-12-13 00:23:52 · 5253 阅读 · 1 评论