
Qt 开发之旅
文章平均质量分 81
Qt 实战经验总结。
梦起丶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Qt 中实现系统主题感知
在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观。Qt 作为一个跨平台的C++图形用户界面应用程序开发框架,提供了丰富的工具和类来实现这一功能。通过类,我们可以在 Qt 应用程序中实现系统主题感知功能。这个类封装了读取系统设置、更新主题颜色和颜色方案以及发出通知的逻辑,使得我们可以轻松地根据系统主题变化来调整应用程序的外观。此外,通过条件编译和平台特定的实现,还确保了跨平台的兼容性。原创 2024-12-28 17:46:39 · 1433 阅读 · 0 评论 -
Qt / Qt Quick程序打包的一些坑 (四)
如果我们的 Qml 中使用了【Qt Shapes】模块,那么在打包的时候,会缺少Qt5QuickShapes.dll。然后,还需要复制【Qt/Version/Kit/qml/QtQuick/Shapes】整个文件夹(注意根据自己使用的编译套件来选择目录)。原创 2024-11-12 19:38:11 · 562 阅读 · 16 评论 -
Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗
最近在写信息提交的窗口时发现一个奇怪的 BUG:可以看到,当 ComboBox 嵌入 Popup 时,点开 ComboBox,然后滚动内容超过其可见区域并不会关闭 ComboBox 弹窗,并且会超出其父 Popup 范围。原创 2024-11-11 18:25:28 · 352 阅读 · 0 评论 -
Qml 实现星级评分组件
在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品、服务或内容进行评价。想必大家在用各种带有评分的软件中看到过这个组件:本文将指导你如何使用Qml创建一个简单而美观的星级评分组件,并且支持高度自定义。原创 2024-09-10 18:01:13 · 901 阅读 · 0 评论 -
Qml 实现水波进度动画条
水波效果最重点的就是水波,其实这个水波就是个障眼法罢了,画张图你们就明白了。其实它就是一个圆角正方形,一直在旋转和上升下降,让用户有一种水波的视觉感~当然,我们还需要将多余的部分裁剪掉,因此这里需要借助。至于进度条和文字就非常简单,直接看源码即可。学习了一下实现思路,觉得很有意思。,有一些小技巧,分享给大家~原创 2024-09-10 18:01:06 · 1018 阅读 · 0 评论 -
Qml 中如何实现私有属性?
在一般编程中,实现私有属性是一种常见的封装实践,它有几个重要目的和好处。 然而,在 QML 中,由于它是一种面向组件编程,并不能像传统的面向对象编程语言那样直接支持私有属性。因此,本篇通过使用一些特殊技巧,也能在 Qml 中实现私有属性。原创 2024-08-22 23:40:56 · 538 阅读 · 0 评论 -
Qml 实现仿前端的 Notification (悬浮出现页面上的通知消息)
在前端中这一般称为 Notification 或 Message,但本质是一种东西,即:悬浮弹出式的消息提醒框。这种组件一般具有以下特点:1、全局/局部显示:它不依赖于具体的页面元素,可以在整个页面的任意位置显示。2、自动消失:默认情况下,消息会在一定时间后自动消失,也可以设置为不自动消失。3、多种类型:支持多种类型的消息,如成功(Success)、警告(Warning)、错误(Error)和 消息(Message)等。4、可配置:可以自定义消息的显示位置、持续时间、内容等。然鹅 Qml 中并未原创 2024-08-22 18:04:05 · 1525 阅读 · 0 评论 -
Qt 中实现异步散列器
虽然QCryptographicHash 很优秀,但它最大的问题在于其散列值的计算是同步的( 即阻塞),对小数据来说并没什么影响,但对大数据来说则意味明显卡顿。因此,我将QCryptographicHash 进行简单封装,扩展了实用性的同时并将计算改为异步,还增加了进度通知和结束通知。原创 2024-08-12 18:42:38 · 1287 阅读 · 0 评论 -
Qt 哈希加密之 QCryptographicHash
哈希函数是一种单向函数,它可以接收一个输入(或称为消息),然后返回一个固定大小的输出,这个输出就是哈希值。确定性:相同的输入总是产生相同的输出。快速计算:计算哈希值的速度非常快。抗篡改性:即使输入数据发生微小的变化,输出的哈希值也会发生显著变化。雪崩效应:输入的微小变化会导致输出的显著变化。难以逆向:从哈希值几乎不可能逆推出原始输入。原创 2024-08-12 18:41:26 · 1367 阅读 · 0 评论 -
提升性能:QML Canvas 绘图优化技巧
优化QML Canvas绘图性能是确保应用程序流畅运行的关键一环。通过采用上述技巧和策略,你可以提升绘图性能,改善用户体验,并确保应用程序在各种设备上都能够高效运行。只有不断地优化和调整绘图代码,结合性能分析工具的使用,才能使你的应用在绘图方面达到最佳状态。原创 2024-04-16 18:19:27 · 1677 阅读 · 0 评论 -
Qml 中的那些坑(六)---对象被错误删除,看不见的垃圾回收
在 Qml 中,很多时候我们需要动态创建一些 Qml 对象,通常是:createComponent + createObject 或createQmlObject。然而,最近工作中却出现了一个相当难以察觉的问题,花了很多时间才定位到关键位置。其根本原因在于:未给动态创建的对象分配 parent ( 即:没有任何对象持有其引用 ),结果就是,当 Qml 引擎运行垃圾回收时,这些对象会被错误清除掉。原创 2024-04-14 16:28:43 · 720 阅读 · 1 评论 -
Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)
之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs。结果后来因为没有相关项目,便停止开发&维护了。不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。因此,本篇就简单讲一下用法。原创 2024-04-01 19:56:05 · 2100 阅读 · 0 评论 -
Qt 实现 Asterix 报文解析库
最近工作中需要解析 Cat 21 和 Cat 62 的 ADS-B 数据 ( 自己的工作包含航空领域 )。然后,因为整个 Asterix 协议类别非常之多,每个类别的版本也多,纯手工实现每个版本解析根本不现实 ( 然鹅公司之前的解析库就是这么做的且做的太烂 )。于是花了很多时间去寻找一个好用的解析库,比如 Wireshark 的 Asterix 解析部分 ( 可惜因为是插件,有点难移出来 )。最后找了很久( Asterix 好像应用比较局限,资料实在太少原创 2024-03-16 17:22:49 · 2582 阅读 · 0 评论 -
Qt / Qml 视频硬解码(CUDA)中如何实现无上传硬渲染(一)
很多时候,我们在对视频的解码和渲染的处理都要经过以下步骤: ◦ 软解码,视频帧位于内存。 ▪ 软渲染,需要拷贝到图像然后渲染;硬渲染则需要上传纹理,然后渲染。 ◦ 硬解码,视频帧位于显存。 ▪ 软渲染,需要下载到内存,然后拷贝到图像再渲染;硬渲染则直接拷贝到纹理,然后渲染。 然而,对于超高分辨率( 4K 8K )而言,上传下载带来的的性能损失太大了( CPU瓶颈 ),为了实现更流畅的体验和更低的资源占用,应当考虑更好的方案。原创 2023-01-09 16:13:07 · 3029 阅读 · 1 评论 -
Qt6 中如何使用 qsb
Qt 6 以后,对于 Qt Quick 不再直接使用各个图形 API 的着色器语言,而是使用一种 .qsb 的文件,这个文件由 qsb.exe 工具生成,它包含了各个图形 API 使用的字节码。通过使用 qsb,我们便可以自由切换硬件渲染后端而无需写多个平台的着色器代码。另一方面,.qsb 文件主要由 Qt Scene Graph 和 Qt3D 使用,当然,Qml 中相关的组件也同样使用,例如:ShaderEffect。因此,本篇使用前一篇的圣诞树作原创 2023-01-03 08:00:00 · 3529 阅读 · 2 评论 -
Qt / Qml 中捕获(中文)输入法事件(按下 & 提交)
最近工作中遇到一个奇怪的问题:本来想在TextEdit(QTextEdit) 中捕获一下键盘按键按下的事件。然而,当输入法为英文时( 正常输入字符 ),可以捕获到按键事件,但当我切换到中文时,弹出输入法选框后,却无法再像英文那样捕获到事件。原创 2022-12-14 12:43:38 · 3841 阅读 · 1 评论 -
Qt / Qt Quick程序打包的一些坑 (三)
最近想把项目升级到 Qt6,因为代码的改动不算很大,所有想着打包也应该差不多。结果因为我使用了 Qt Charts,怎么也运行不起来,后来通过动态库依赖才发现 Qt6 新增加了一个 Qt6OpenGLWidgets.dll,并且打包时并不会自动复制,只能手动拷过来了。原创 2022-11-29 12:56:43 · 1698 阅读 · 0 评论 -
Qt 中捕获三方库&自身标准打印方法
很多时候,我们为了方便调试,常常需要加入一些打印。例如 Qt 中的 QDebug,C 和 C++ 中的 printf / cout 等等,又或者是三方库提供的标准打印接口。然而大部分时候,这些打印相当不统一(格式和位置),并且因为 Qt 作为 GUI 框架,调试信息实在不应该直接置于 UI 之上。因此,需要一种能统一和标准化所有标准打印的方法( 所谓标准打印即标准输出 stdout),并且能够动态配置。原创 2022-11-22 09:00:00 · 2490 阅读 · 0 评论 -
纯 Qml 实现仿画图3D的颜色选择器(更强更易用)
在做编辑相关的应用经常会用到颜色选择器。实际上, Qt Widgets 时代使用 QColorDialog 或者 Qml 中 ColorDialog即可完成一般的颜色选择的需求。 然鹅现在都 Windows 11了!!还在用那么拉跨的东西,实在是看不下去了。 然后自己一直很喜欢用 Windows 画图3D的那个颜色选择器,因此我决定仿照实现一个,并且还为它增加了一个透明度。原创 2022-11-16 10:00:00 · 2528 阅读 · 4 评论 -
Qt6 中使用 Core5Compat 和 Qt5Compat
最近用 Qt6 有一段时间了,其实对于 Qml 来说,语法上的变动不是很大。 不过在一些组件的使用中发现很多效果和以前不太一样。 另一方面,Qt5 (Qml) 中一些比较常用的也消失了,并且没有直接替代,需要注意。 其中,影响最大的是 移除了 QtQuick.Controls 1.x 和 QtGraphicalEffects 移动到 Qt5Compat 模块中。 而对于 Qt C++ 部分,影响最大的则是 QTextCodec ,并且没有直接替代...原创 2022-07-10 14:57:00 · 7308 阅读 · 3 评论 -
Qml 计算实际帧率(FPS)的方法
在 Qml 中,任何可视化的项的显示 ( 渲染 ) 都依赖一个根 QQuickWindow,它们包含了底层的场景图渲染器。 因此,如果我们想要在 Qml 中获取 FPS,则只需在窗口渲染场景图时记录帧数并计算帧率即可。 不过,需要注意的是:GUI 程序一般不会频繁刷新,并不建议使用循环 update() 来计算 ( 可行但并非最佳 )。 .........原创 2022-07-05 00:01:37 · 2009 阅读 · 0 评论 -
无事件循环或非 GUI / Qt 线程中使用 QTimer
【写在前面】原创 2021-09-22 00:05:33 · 2224 阅读 · 3 评论 -
QWidgets 与 Qml 相互嵌入方法,以及其中的一些坑
【写在前面】有时候,当我们接手一个老项目( 也可能不老-.-)时,会碰上这些情况:1、老项目实用 QWidgets,想要部分或全部迁移到 Qml。2、老项目实用 Qml,想要部分或全部迁移到 QWidgets。然而,很多时候全部迁移几乎不现实,此时,折中的方案应运而生:QWdigets 和 Qml 相互嵌套使用。本篇主要内容:1、Qml 嵌入 QWiidgets中的方法及一些坑;2、QWiidgets嵌入Qml中的方法及一些坑;【正文开始】Qml 嵌入...原创 2021-05-30 19:41:29 · 12232 阅读 · 15 评论 -
Qml 中实现对原始视频图像格式( YUV / RGB )支持
【写在前面】之前一直在学着视频相关的知识,然后工作也正好是监控相关的。并且界面部分用Qml 开发的。一开始,我觉得相当容易,只是显示解码好的图像而已,没什么难度。因为之前写过一篇在 Qml 中实现:https://blog.youkuaiyun.com/u011283226/article/details/104051033?spm=1001.2014.3001.5501这个方法优点是简单,但是缺点是只支持 QImage/QPixmap/QQuickTextureFactory。...原创 2021-04-11 17:11:07 · 4259 阅读 · 7 评论 -
Qt 中实现任意阶贝塞尔曲线绘制 & 动态调节
【写在前面】Qt 中有相当方便的绘制接口 ( 由 QPainter 提供 ) 。例如贝塞尔曲线的 API:QPainterPath 的 quadTo() 和 cubicTo() 然后使用 QPainter::drawPath()。然而,美中不足的是,Qt 的贝塞尔曲线只支持二次和三次,对于更高阶的似乎就无能为力了。即便多个 quadTo() 或 cubicTo() 连用的效果也非常不理想。因此,我想到利用贝塞尔的公式生成曲线点,然后用直线来连接,即可实现「 N阶贝塞尔曲线绘制 」。原创 2021-04-04 18:10:55 · 7081 阅读 · 5 评论 -
QTextStream格式化文本:位级表示 / 字节表示 / 内存地址
【写在前面】最近在看《深入理解计算机系统 第二版》简称 CSAPP,这本书我是极力推荐的,深度和广度都有 ( 而且讲解得非常仔细 )。然后自己是第二遍看了 ( 之前看的第一版,第二版有不少新东西),里面的题也是一直跟着做的,就顺手写了几个小函数来方便做题。因为书里的一些题目很多时候需要查看变量的【位级表示 / 字节表示 / 内存地址】,然而对简单打印出来的格式很不满意,所以想着 Qt 中比较好用的 QTextStream 来进行格式化输出 ( QDebug 也可以,但还不够方便)。所以这..原创 2020-07-26 14:23:51 · 1620 阅读 · 0 评论 -
Qml实现简易版Qt Linguist(语言家) & QXmlStreamReader / QXmlStreamWriter 的使用方法
【写在前面】因为之前写了几篇文章,是Qt 翻译的相关的,然后自己就去了解了下 TS 文件( Translate Source 翻译资源文件 )。发现只是比较简单的 XML 文件,又因为自己对 Qt 读写 XML 用的并不是很多,就想着学习一下在 Qt 中读写XML。结果。。顺便做了个 Qml 版的 Qt 语言家 ─.─|||。。【正文开始】在Qt 中,有三种读写 XML 文档的方法:1、QXmlStreamReader / QXmlStreamWriter :QXmlStr..原创 2020-06-30 23:05:31 · 925 阅读 · 0 评论 -
Qt Linguist(语言家)与QtCreator集成
写在前面Qt Linguist ( Qt语言家 ) 是一个专为 Qt 应用添加翻译的工具。然而,在 QtCreator 中集成了 lupdate 和 lrelease,却缺少 linguist。因此,在这里写一篇 Qt Linguist(语言家)与 QtCreator 集成的方法。并且,如果有其他第三方工具,也可以对照此方法进行集成 ✓。正文开始直接进入正题:在 QtCreator 中打开 工具/(设置) => 选项。打开 环境,点击 外部工具。点击 添加工具 ,命名为 翻译原创 2020-05-25 11:36:26 · 2614 阅读 · 0 评论 -
Qt / Qml 中支持多国语言
【缘起】最近找到一个看起来比较好用的开源工具( 然鹅不太会用 ),但整个界面都是英文的。不过由于是 Qt 写的,所以就尝试自己做些汉化。然后了解到不少实现多国语言相关的技术( 以及一些坑 (‾◡◝) )。这里写一篇完整且具体的,「 如何在 Qt / Qml 中支持多国语言 & 动态翻译」。【正文开始】按例先上效果图。QtWidgets 的:实际上,这里包含两部分: 静态部分: - MainWindow Title「 MainWindow =>...原创 2020-05-25 17:44:50 · 3974 阅读 · 3 评论 -
Qt / Qt Quick程序打包的一些坑 (二)
【写在前面】打包方法见Qt / Qt Quick程序打包的方法。这里是再次记录一个坑(爹)。【正文开始】直接进入正题:如果我们的 Qml 中使用了【Qt Labs】模块,那么在打包的时候,目录下多出一个 Qt\labs文件夹。但是,在 labs 下面会缺少一个文件夹,导致应用无法运行。只能使用 Process Explorer 找到每一个 dll,然后复制进去尝试。...原创 2020-05-06 16:06:14 · 1626 阅读 · 8 评论 -
Qml中使用QtSingleApplication & QtService
【写在前面】在很多软件中,程序通常需要这样一个状态:只有一个实例运行中。而另一些特殊的应用程序,它们又需要长期运行。实际上,对于这些情况,Qt 早已提供了解决方法:QtSingleApplication 和 QtService。不过要注意的是,它们并没有被包含在官方库中。【写在前面】...原创 2020-04-29 15:41:58 · 1269 阅读 · 9 评论 -
Qt / Qml 实现历史编辑器 ( 支持历史搜索 & 关键字匹配 )
【写在前面】这几天突然想起来,之前公司有个需求,是类似于搜索引擎的那种关键字排序。当然了,并不是做搜索,而且对历史输入记录的一个匹配 + 排序。然鹅因为疫情,工作已经辞了,但想着这个东西挺有意思的,还是决定实现一下。【正文开始】老样子,先展示一下效果图:...原创 2020-03-19 16:59:20 · 2027 阅读 · 2 评论 -
Qml中实现多视图,多图像源(QImage / QPixmap)
【写在前面】在 Qml 中,实现多视图很容易,无非是多个 Image 而已。但是,如果需要动态刷新,则变得困难。再或者,来自多个不同的图像源,将更加复杂。实际上,这在 Qt( Widgets ) 中实现却很容易,究其原因,是 Qml 中缺少对 QImage ( 或者说 原始图像) 的支持 。即便如此,Qt 仍提供了一种解决方法。本篇主要内容:1、QML 中支持 QI...原创 2020-01-30 19:52:32 · 6222 阅读 · 13 评论 -
Qml中的那些坑(三)---KeyEvent 的 key / virtualKey / scanCode
【写在前面】在 Qt 中,对于一个键盘事件 QKeyEvent ,通常包含三种键值:1、key:Qt 键值,例如Qt::Key_Escape。2、nativeVirtualKey:本机虚拟键值,例如 VK_ESCAPE ( windows )。3、nativeScanCode:本机扫描码。【正文开始】在 Qml 中,也存在着键盘事件:KeyEvent。看起来它...原创 2019-12-22 17:27:24 · 3568 阅读 · 1 评论 -
Qml中的那些坑(二)---QWindow的closeEvent
【写在前面】在很多应用中,很可能会需要这样的功能:我们点击窗口上的 × ,并不是要真的退出应用,而是要它们以小托盘的形式继续运行。情况 1:如果 × 是自定义的按钮,我们可以轻易控制它的行为,hide ->system tray。情况 2:如果 × 是窗口自带的按钮,那么对于QWidgets 来说,我们只需要重写其 closeEvent 方法,然后实现想要的动作。然鹅,对...原创 2019-11-13 23:33:57 · 4287 阅读 · 0 评论 -
Qt Quick实现多边形窗口(不规则窗口)
【写在前面】在 Widgets 中,不管是绘图( 使用QPainter ),还是不规则窗口( 使用setMask )都很容易。但是,Qt5 以后( Qt Quick / QWindow中),事情就不那么简单了。即使是绘制一张图片( Image )都非常麻烦,能用的方法是:1、使用 OpenGL API。2、使用 Scene Graph API。3、使用 Image(QM...原创 2019-11-07 23:08:55 · 3665 阅读 · 4 评论 -
QML中动态创建组件(同步/异步)的方法
【写在前面】在QML中想要动态创建组件,一般有两种方法:1、使用Loader。2、使用JavaScript:Qt.createComponent() / Qt.createQmlObject()。当然,这里不仅会介绍他们的一般用法,还有如何使用它们来进行同步/异步的创建。【正文开始】首先介绍Loader:很简单,我们可以先声明,然后通过动态设置它的source / s...原创 2019-08-11 22:48:54 · 7279 阅读 · 6 评论 -
Qt使用TCP实现的简单服务端和客户端(带心跳检测)
【正文开始】之前在做一个简单的聊天工具,界面基本是完成了,但是肯定是要用tcp传输的,自己大概的做了一个简单的实现,然后也加入了心跳检测的机制,还是先上一下效果图:使用Qt的网络功能,需要在.pro中加入 QT += network服务端我使用QTcpServer来建立, ps:(因为窗口是qml做的,所以会有很多invokeMethod  ̄へ ̄,不用在意)主要就是重新实现其 ...原创 2018-04-13 20:47:37 · 28066 阅读 · 36 评论 -
Qt中的那些坑(二)---qDebug和QString中的转义字符
【写在前面】qDebug 和 QString 算是Qt中最常用也最好用的工具了。然鹅今天在使用它的时候,遇到了一些非常奇怪的问题。结果实际上这个坑是 qDebug导致,所以也不能全怪 QString。【正文开始】 首先,我们来看一段代码: #include <QCoreApplication>#include <QDir>#include ...原创 2019-09-25 22:01:01 · 17637 阅读 · 6 评论 -
FFmpeg开发之旅(二)---音频解码
【写在前面】前面我介绍了视频解码的流程,发现基础讲得有点少。因此这里附上一些额外的基础内容:https://blog.youkuaiyun.com/u011283226/article/details/101024093本篇主要内容:1、FFmpeg音频解码基本流程2、libswresample的基本使用方法【正文开始】实际上音频解码和视频解码的流程是一样的,因此就不花篇幅讲流程...原创 2019-09-20 20:24:41 · 1213 阅读 · 0 评论