
Qt 略知一二
文章平均质量分 67
Qt Widgets相关
龚建波
熟悉C++ Qt,Python等
展开
-
QSettings::registerFormat 自定义 ini 读写
QSettings 默认不支持 UTF-16 等多字节编码,即便设置 setIniCodec("UTF-16LE") 仍然不能正常解析,但是对于 ASCII 兼容的编码就可以。可能是因为 QSettings 源码中是直接读成 QByteArray 后根据 ASCII 字符来判断分节和内容等信息,设置的 codec 只在判断完之后做字符串转换才会用到。而 Windows 的 Get/WritePrivateProfileStringW 等接口读写 ini 时会用 UTF-16LE 编码原创 2025-03-24 11:45:59 · 196 阅读 · 0 评论 -
Qt获取屏幕DPI缩放比
网上很多代码是用logicalDotsPerInch 除以 96 来获取屏幕缩放比,当使能了缩放适配后,logicalDotsPerInch 值就不随系统缩放变了,我们需要更通用的方式。原创 2023-12-21 14:31:11 · 4454 阅读 · 0 评论 -
Qt + QR-Code-generator 生成二维码
之前使用 libgrencode 生成二维码,LGPL 协议实在不方便,所以需要找一个 github 星星多的,代码简单最好 header-only,协议最好是 MIT 或者兼容协议而不是 GPL 或者 LPGL。QR-Code-generator 正好符合这个要求,而且还提供 C / C++ / Java / Python 等多种语言实现,直接把 qrcodegen.hpp / cpp 类文件放到我们项目里就能使用。原创 2023-07-12 11:18:17 · 4439 阅读 · 0 评论 -
Qt在Mac上实现USB热插拔检测
Mac 上的 USB 热插拔检测,可以通过 IOKit framework 来实现。但是,USB 插拔消息来的时候,QCamera 还没法枚举到对应的摄像头,这个和 Windows 是一样的,需要注册相机的插拔回调才行。原创 2023-03-26 16:13:55 · 3010 阅读 · 0 评论 -
Qt重定向QDebug,自定义一个简易的日志管理类
相对于第三方的日志库,在 Qt 中使用 QDebug 打印更便捷,有时候也需要对 QDebug 输出进行重定向,如写入文件等。返回的函数指针我们可以保存起来,需要输出到控制台时进行调用。原创 2020-08-16 00:21:52 · 5782 阅读 · 6 评论 -
Qt打开文件夹并选中文件
QDesktopServices::openUrl() 如果参数是文件夹会在资源管理器打开,如果参数是文件会用默认打开方式打开,不符合需求。想要打开文件夹并选中文件,在 Windows 上可以用 QProcess 执行 explorer 命令:原创 2023-02-27 01:27:41 · 6213 阅读 · 4 评论 -
Qt在Windows上的设备热插拔检测
一般 Qt 在 Windows 上做设备热插拔需要两个步骤:1.使用 win32 的 RegisterDeviceNotification 函数注册要监听的设备类别,需要绑定一个窗口 id;2.重写 QWidget 的nativeEvent 虚函数或者QAbstractNativeEventFilter 的nativeEventFilter 虚函数,处理热插拔相关的回调。后来参考别人的代码,可以创建一个 win32 的隐藏窗口来接收消息,这样就不用耦合到 Qt 界面上的窗口了。原创 2023-01-16 11:54:02 · 3700 阅读 · 0 评论 -
Windows上让Qt5 QCamera响应UVC摄像头硬件按钮拍图
QCamera相机类提供了一些基本的功能,包括拍照和录制功能(Windows上不支持录制视频),但也有很多接口是没有封装的,比如有些UVC摄像头有物理按键,可以进行拍图等操作,但是QCamera没法响应硬件按钮的拍图操作。想让QCamera响应硬件按钮的拍图操作,只需要修改下directshow这个插件即可,而其他的视频渲染等功能就不用自己封装了。原创 2023-01-15 18:25:42 · 3616 阅读 · 11 评论 -
Qt实现程序重启功能
主要逻辑就是退出当前进程,QProcess::startDetached 开启新的进程原创 2022-11-30 23:11:26 · 3632 阅读 · 0 评论 -
Qt+FFmpeg解视频帧转为QImage
遇到的小问题:1.用 avcodec_receive_frame 获取解码后的帧数据,返回 AVERROR(EAGAIN) (值为-11),文档描述为:输出在此状态下不可用-用户必须尝试发送新输入,所以加了个 continue 循环执行avcodec_send_packet,直到可用。2.sws_scale视频像素格式和分辨率转换的输出可以直接用字节缓冲区接收,不一定非要把缓冲区 attach 到 AVFrame 上。原创 2022-09-21 13:53:01 · 2441 阅读 · 1 评论 -
cv::Mat与QImage的互相转换
OpenCV 的 cv::Mat 和 Qt 的 QImage 的转换很简单,网上也很多参考,这里只是记录一下。转换的时候除了要关注构造参数中的图像宽高、存储精度、通道数和通道顺序外,大小端也需要注意。如 QImage::Format_ARGB32 是用 32 位整形存储一个像素,虽然写的是 ARGB 顺序,但是由于存储大小端的关系,PC 一般小端存储,所以字节顺序成了 BGRA。直接通过数据指针构造 QImage 是复用的原来的内存,要注意释放顺序,也可以 copy 拷贝一份,cv::Mat 同理。原创 2022-08-30 01:35:29 · 9539 阅读 · 9 评论 -
Qt程序设计:多个View共享数据
当多个 View 展示同一个数据集中的部分数据项时,其中一个 View 进行了增删改操作,也需要同步到其他的 View。有两种比较简单的解决方案:方案一:共用一个 Model 实例,通过 Proxy 来辅助完成过滤和选择等操作。方案二:多个Model 持有同一组数据项指针(建议用智能指针),更新之后通知所有关联的 View 进行同步刷新。...............原创 2022-07-11 00:10:05 · 2355 阅读 · 3 评论 -
Qt音频相关类升级到Qt6之后的一些变化
Qt6 重构了多媒体模块,一些接口也随之变动,本文记录用到的部分音频相关类的变化。(PS:Qt6.2 该模块才回归,模块名未变,依旧是 multimedia)原创 2022-07-07 00:33:14 · 3774 阅读 · 1 评论 -
Qt6属性绑定
基本使用(详见官方博文:All about property bindings in Qt 6.2)在 QML 中,我们可以通过属性绑定使得关联的属性自动更新。如下的代码片段使得 height 绑定到 width,当 wdith值变化时,height 的值也能根据绑定的表达式重新计算:import QtQuick 2.15Rectangle { width: 10 height: width}在 Qt6 中,属性绑定这一机制也被引入到了 Qt C++,将上面 QML.原创 2022-05-02 18:33:52 · 1383 阅读 · 0 评论 -
Qt实现路径渐变,绘制彩色的线条
Qt本身是没有路径渐变的,只提供了三种基本的渐变类型:常见的解决方案是,对路径分段进行线性渐变填充,本文也是采用该方法,效果如下:主要用到 QPainterPath 的两个接口:length路径整体长度,和pointAtPercent根据百分比求路径上点坐标。pointAtPercent 是一个较为费时的函数,尽量不放在 paintEvent 中计算,避免卡顿。qreal QPainterPath::length() constQPointF QPainterPath::poi...原创 2022-03-27 04:04:45 · 4321 阅读 · 2 评论 -
Qt示例学习:Cube OpenGL ES 2.0
0.前言该示例展示了如何在 Qt 中使用 OpenGL ES 2.0 编写可鼠标操作旋转的 3D 立方体。示例整体比较简单,只需要一点点 OpenGL 基础。主要有两个点可作为学习参考,一是 Qt 封装的 OpenGL 便捷类(顶点缓冲,着色器程序等)的基本使用,二是四元数类 QQuaternion 的基本使用。在 Qt Creator 搜索 cube,或者源码示例中查找Qt 安装后示例路径:D:\QtOnline\Examples\Qt-5.15.2\opengl\cubeQt 源码路原创 2022-02-15 17:08:05 · 3756 阅读 · 0 评论 -
Qt QScopeGuard学习
最近改了自己的三个代码 Bug 都是任务终止时资源清理出了问题,要么任务取消后没删除缓存文件并返回 false,要么当前步骤判断任务取消后又在下一步流程继续执行了。为什么不判断取消后就直接 return 呢?因为还有一些清理工作,然后还需要把状态传递给其他对象。减少这种逻辑上的失误,还是得从代码设计上着手。目前能想到的有 scopeguard、goto(C++ 异常没有 final ,不然也可以算上)。正好 Qt 提供了 QScopeGuard 可以学习下,虽然原理很简单,就是 guard 对象析构时执原创 2022-01-31 23:26:09 · 2241 阅读 · 0 评论 -
QTextEdit的几种高亮设置(选中文本、关键字)
文本选中区域的颜色可以用 QPalette 或者设置样式表,选中后默认文本是渲染为白色,可以设置 palette 的 brush 为 Qt::NoBrush 保持原本的文本颜色。 //背景和选区颜色 QPalette pt = palette(); pt.setBrush(QPalette::Text, Qt::white); pt.setBrush(QPalette::Base, Qt::black); pt.setBrush(QPalette::Highl..原创 2022-01-16 19:22:36 · 8119 阅读 · 0 评论 -
Qt 二维码生成与识别库:QZXing 的编译与使用
zxing 是一个开源的一维/二维条码图像处理库,当前版本为 Java 语言开发:https://github.com/zxing/zxingQZXing 是 ZXing 的 Qt 移植版本,同样还有 cpp 等语言和框架的移植版本。从 QZXing 的文档可以看到,只有 QR Code 二维码支持编码,其他都只支持解码。https://github.com/ftylitak/qzxing该库使用的Apache2.0 开源协议,可以放心食用。原创 2022-01-12 23:31:45 · 8570 阅读 · 4 评论 -
Qt + libqrencode 生成二维码
0.前言libqrencode 是一个生成二维码的 c 语言库,二维码的容量可达 7000 位或 4000 个字符,采用 LGPL-2.1 协议可放心食用,github 链接如下:https://github.com/fukuchi/libqrencodelibqrencode 支持 JIS(日本工业标准)X0510:2004 或 ISO / IEC 18004 中描述的 QR Code 模型 2。该规范中的大多数功能都已实现,例如:可以嵌入数字,字母,日语汉字(Shift-JIS)或任何原创 2022-01-11 01:41:12 · 2439 阅读 · 2 评论 -
Qt实现一个隐式共享类(使用QSharedDataPointer)
前言所谓的隐式共享,就是多个对象引用同一数据(参考智能指针),只在修改内容时才创建新的数据副本(即 copy-on-write 写时复制)。大部分 Qt 容器及相关类都是隐式共享的,且提供了 QSharedData 和 QSharedDataPointer 来帮助我们快速地实现自己的隐式共享类(Qt 自带的容器并没有使用该便捷类,是定制化的实现)。原理参照 Qt 文档中的示例,要使用 QSharedDataPointer 实现隐式共享,需要定义两个类。一个类继承自 QSharedData 用于.原创 2021-12-25 23:55:10 · 2559 阅读 · 0 评论 -
Qt多语言翻译(国际化)
有的软件需要根据用户的设置来切换显示的语言,Qt 提供了一套用于Internationalization 的机制来帮助我们实现语言切换。大致的流程:首先用 lupdate 工具根据源码中标记的字符串生成ts 文件,然后通过Linguist(Qt语言家)工具进行编辑,再用 lrelease 工具发布qm 翻译文件,最后代码中加载这个 qm 翻译文件。其中 lupdate/lrelease 工具的使用已经集成到 Qt Creator 和 Linguist,可以快速地生成相应的文件。原创 2021-12-18 17:58:14 · 12353 阅读 · 1 评论 -
Qt画一个太极
0.前言之前看到一个有意思的太极动画,原图效果如下:虽然看起来是 3D 的,但是观察角度并没有变,而且图形也只有两个平面在旋转,除了一些光晕的效果,完全可以用 QPainter 画一个类似的。本文代码效果及链接如下:github 链接(TaiJi类):https://github.com/gongjianbo/EasyQPainter1.实现思路观察原图可以发现,两个平面相交于一条线,那么我们可以以这条线将两个平面都分割为成表面和底面两部分(其实就是 z 值低于这条线的就会.原创 2021-12-10 01:14:25 · 1750 阅读 · 4 评论 -
Qt绘图:坐标轴
绘制图表很重要的一步就是确立坐标轴,有了标尺,才能找准自己的定位。每一个数据点都需要根据坐标轴来计算数据值对应的屏幕像素位置。本文代码源码链接及实现效果如下。原创 2021-12-04 02:28:57 · 11646 阅读 · 6 评论 -
Qt绘图:选中区域
0.前言选区操作是比较常见的需求,如截图、图表等。一般矩形选区居多,有的是四个边都可编辑,有的是横向可编辑。单个选区的操作逻辑也是比较简单的,之后会在此基础上增加更复杂的需求。本文代码源码链接及实现效果如下:github 链接(SimpleSelection类):https://github.com/gongjianbo/EasyQPainter1.实现细节矩形区域可以用 QRect 来保存,先对这个类有个基本的认识:QRect有四个成员变量,分别对应左上角和右下角点坐标x.原创 2021-12-01 23:52:04 · 3668 阅读 · 3 评论 -
Qt绘制旋转的轮播图
目前见的比较多的轮播图有平移和旋转两种方式。平移类似淘宝那种切换幻灯片一样的效果,旋转一般是近大远小,看起来有点3D的感觉。本文代码实现旋转轮播图效果如下完整代码链接。原创 2021-10-31 23:46:58 · 2918 阅读 · 0 评论 -
Qt Remote Objects远程调用模块的基本使用
Qt Remote Objects 是从 Qt5.9 加入的 RPC 远程调用模块。从个人使用实践来看,相比其他流行的 RPC 框架,也有一些优势:Qt-like:如果使用 grpc,那么一些Qt 自带的类型,如 QString 、QByteArray 等需要转换成 grpc 支持的几种基本类型,序列化时会有字符串编解码不一致的风险。使用 QtRO 则天生支持这些 Qt 的类型,而且定义的接口支持信号槽。轻便:QtRO 模块是一个轻量级的模块,使用起来也很简单。原创 2021-09-04 18:57:35 · 4678 阅读 · 7 评论 -
Qt+Win32进行简单的多进程管理
本来首先想到的是使用QProcess来启动子进程,但是启动之后想要结束或者是判断进程状态属实不方便,索性直接全用Win32的接口来操作。由于需求简单,只是一个主程序对应多个子进程的形式,所以也不需要设计什么进程调度,只需要启动、关闭和检测进程运行状态。子进程也可以轮询检测主进程执行状态,异常则自动退出进程,我是通过启动参数的方式将主进程pid传递给的子进程,然后以OpenProcess接口来拿到对应的句柄。,为了方便创建进程时拿到对应的句柄,没用CreateProcess,选择了。.........原创 2021-09-01 01:01:14 · 1977 阅读 · 0 评论 -
Qt实现HTTP文件上传下载(Flask服务端)
接上一篇 Qt HTTP 基本操作:https://blog.csdn.net/gongjianbo1992/article/details/975688631.准备服务端测试代码只需要上传和下载两个接口,实际应用时可能还需要 token 验证之类的,而且也没有对文件传输结果进行校验。#using flask 2.0.1import os,sysfrom flask import Flask,request,jsonify,send_file,send_from_directoryap原创 2021-08-07 18:28:19 · 4036 阅读 · 1 评论 -
Qt写一个简易的ini文件读写类
.ini 文件是 Initialization File 的缩写,即初始化文件。Qt 提供的 QSettings 类可用于 ini 配置文件的读写,但还存在一些问题,比如:保存时会把已有的注释清掉,中文的分组和键编码有问题,字段长度限制,缓存问题等等。自己写一个ini读写类只是方便以后遇到问题用来替换。原创 2021-04-28 18:33:35 · 2709 阅读 · 0 评论 -
记录:MSVC+Qt生成dump文件
本文只是记录下 MSVC+Qt 生成 dump 的代码。dump 文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,当程序异常无法在调试环境里解决时,dump 文件是分析问题的重要手段。相关 win API 文档可以在 MSDN 查看:https://docs.microsoft.com/zh-cn/search/?terms=MiniDumpWriteDumpDUMPTYPE 参数我只使用了MiniDumpNormal,可以根据文档加上自己需要的。dump 文件一般配合 .原创 2021-02-11 19:14:14 · 1600 阅读 · 4 评论 -
Qt 实现类似 Python turtle 海龟绘图的动画效果
1966年,SeymourPapert 和 WallyFeurzig 发明了一种专门给儿童学习编程的语言——LOGO 语言,它的特色就是通过编程指挥一个小海龟(turtle)在屏幕上绘图。海龟绘图(TurtleGraphics)后来被移植到各种高级语言中,Python内置了 turtle 库,基本上完整复制了原始 TurtleGraphics 的所有功能。海龟绘图的特点就是以动画的形式绘制出图案,这比直接展示最终图案更有趣。要在 Qt 中实现这种动画效果,我的思路就是通过定时器刷新当前进度,...原创 2021-01-02 18:54:32 · 1716 阅读 · 1 评论 -
SILK SDK + Qt 将QQ/微信的 silk/amr 音频转为 wav 格式
参考示例:SILK_SDK_SRC_v1.0.9\SILK_SDK_SRC_ARM_v1.0.9\test\Decoder.c参考博客(转载):Android 多媒体之 Silk 格式音频解码_weixin_34292924的博客-CSDN博客别人做的decoder:kn007/silk-v3-decoder: [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and原创 2020-11-29 20:31:51 · 3015 阅读 · 0 评论 -
FFmpeg + Qt 音频文件转PCM数据
本文通过重采样的方式,将音频文件中的数据转为指定参数格式的 PCM 数据。FFmpeg 中重采样的功能由 libswresample 提供,该模块提供了高度优化的转换音频的采样频率、声道格式或采样格式的功能。如果不转换直接读取文件的 PCM 数据,因为格式比较多,处理起来也挺麻烦,重采样之后便于进一步的处理,如绘制波形等。...原创 2020-11-25 12:23:31 · 4587 阅读 · 2 评论 -
QStyledItemDelegate基本使用:单元格数据渲染与编辑
前言QStyledItemDelegate 继承自 QAbstractItemDelegate,主要用于为 Model-View 中的数据项提供显示和编辑功能。QAbstractItemDelegate 有两个字类,QStyledItemDelegate 和 QItemDelegate,根据文档描述QStyledItemDelegate 使用当前样式来绘制,不过默认实现的显示效果基本差不多,具体设计上的差异暂略。之所以用QStyledItemDelegate ,是根据文档的建议,在实现自定义 del..原创 2020-09-20 01:55:59 · 27032 阅读 · 10 评论 -
QAbstractTableModel基本使用:排序相关接口
前言QAbstractTableModel 继承自QAbstractItemModel,主要用于为 QTableView 提供相关接口,我们可以子类化该抽象类并实现相关接口。本文主要讲QAbstractTableModel 提供的 sort 接口的相关细节。(请确保自己已经熟悉了 rowCount、columnCount、data 等基础的接口)使用 QTableView 的排序功能QTableView 有个setSortingEnabled 接口,设置为 true 后,我们就可以通过...原创 2020-09-19 00:35:54 · 2387 阅读 · 3 评论 -
QAbstractTableModel基本使用:表头相关接口
前言QAbstractTableModel 继承自QAbstractItemModel,主要用于为 QTableView 提供相关接口,我们可以子类化该抽象类并实现相关接口。本文主要讲QAbstractTableModel 为 QHeaderView 表头提供的接口如何使用。(请确保自己已经熟悉了 rowCount、columnCount、data 等基础的接口)表头相关接口的使用一个完整的 QTableView 还包含了行列两个 QHeaderView 表头,表头的 model 可以独..原创 2020-09-17 23:59:32 · 5638 阅读 · 1 评论 -
QAbstractTableModel基本使用:数据加载以及增删行列
前言QAbstractTableModel 继承自QAbstractItemModel,主要用于为 QTableView 提供相关接口,我们可以子类化该抽象类并实现相关接口。本文主要讲QAbstractTableModel 数据的加载与更新,以及行列的增删。(请确保自己已经熟悉了 rowCount、columnCount、data 等基础的接口)加载数据并刷新当我们想重置 model 的数据时,可以将重置的逻辑放在beginResetModel 和endResetModel 两个函数...原创 2020-09-17 01:25:01 · 24252 阅读 · 13 评论 -
QAbstractTableModel基本使用:数据展示与编辑
前言QAbstractTableModel 继承自QAbstractItemModel,主要用于为 QTableView 提供相关接口,我们可以子类化该抽象类并实现相关接口。本来主要讲下QAbstractTableModel 数据展示和编辑相关的接口如何使用。表格数据的展示继承QAbstractTableModel 后,至少要实现三个纯虚函数接口才能进行实例化:virtual int rowCount(const QModelIndex &parent = QModelInd...原创 2020-09-16 00:56:46 · 15689 阅读 · 17 评论 -
QTabWidget自定义,拖入拖出Tab页的简易实现
0.实现效果(声明:这只是个测试,不是很满意,放着也没用就分享下)实现效果GIF:完整代码链接:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/MyTabWidget相关参考:https://www.cnblogs.com/findumars/p/5175984.html相关参考:https://github.com/MRXY001/Qt-DragableTabWidget1.实现过程QTabWidget的Tab原创 2020-09-09 21:33:40 · 7877 阅读 · 9 评论