- 博客(43)
- 收藏
- 关注
原创 Qt/C++项目:仿网易云音乐播放器(阶段型停工)
SLTwitness开源了一个基于QML开发的网易云音乐风格播放器LisMusic,目前已实现基本播放功能和部分UI界面。项目支持网络歌曲搜索和本地音乐导入功能,虽然功能尚不完善但已完成基础框架。作者在GitHub发布了项目源码和可执行版本,邀请开发者体验并希望获得Star支持。该项目展示了QML在音乐播放器开发中的应用潜力。
2025-10-27 14:16:59
1597
原创 Qt QML中ListView的高亮效果
本文介绍了如何实现ListView的高亮效果。通过设置preferredHighlightBegin/End定义高亮区域,使用StrictlyEnforceRange强制currentIndex处于该区域,并控制回滚时间和速度。还展示了通过OpacityMask添加渐隐效果增强视觉体验。关键属性包括highlightFollowsCurrentItem、highlightRangeMode和indexAt方法,最后通过遮罩效果完善了滚动体验。
2025-10-26 13:33:07
916
原创 【力扣hot100】238.除自身以外数组的乘积
摘要:本文介绍了一种不使用除法在O(n)时间内计算数组中除自身外元素乘积的方法。通过构建前缀积和后缀积数组,可以有效求解。作者最初采用递归实现,虽满足时间复杂度但效率较低。优化方案是先正向遍历计算前缀积,再反向遍历乘以后缀积,最终得到结果。该方法巧妙避免了除法运算,示例展示了输入[1,2,3,4]输出[24,12,8,6]的正确性。(149字)
2025-10-25 13:48:03
258
原创 Qt QML如何做出圆角图片(颜色格式)
摘要:本文介绍了使用OpacityMask实现图片圆角裁剪的前端美化方法。通过示例代码展示了如何利用Image控件的fillMode属性和OpacityMask遮罩效果,其中重点讲解了PreserveAspectCrop等填充模式的使用。文章还详细解析了layer.enabled、layer.smooth等属性的作用,说明OpacityMask通过alpha通道决定图片显示/裁剪区域的原理。这种技术方案解决了长期以来图片圆角裁剪的实现难题。
2025-10-24 13:36:29
556
原创 【力扣hot100】538. 把二叉搜索树转换为累加树
摘要:题目要求将二叉搜索树转换为累加树,即每个节点的新值为原树中所有大于等于该节点值的和。解题思路是利用逆向中序遍历(右-根-左),通过累加变量sum记录当前总和。代码实现中,递归函数先处理右子树,然后更新当前节点值为累加和,最后处理左子树。该方法时间复杂度为O(n),空间复杂度为O(1)。示例验证了算法的正确性,如输入[4,1,6...]转换为[30,36,21...]。
2025-10-23 21:28:30
241
原创 【力扣hot100】104.二叉树的最大深度
摘要:本文介绍了计算二叉树最大深度的递归解法。最大深度定义为从根节点到最远叶子节点的最长路径上的节点数。采用深度优先搜索(DFS)策略,当遇到空节点时终止递归并更新最大深度值。每次递归调用时深度计数加1,分别遍历左右子树。时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。该方法简洁高效地解决了二叉树最大深度计算问题。
2025-10-22 19:23:35
250
原创 【力扣hot100】114. 二叉树展开为链表
本文介绍了将二叉树展开为单链表的算法。题目要求展开后的链表与二叉树先序遍历顺序相同,且右指针指向下一节点,左指针为null。通过逆前序遍历(先右后左)的方式,在回溯阶段逐个连接节点,最终实现原地修改。关键点在于使用递归记录前驱节点,确保正确链接顺序。时间复杂度O(n),空间复杂度O(n)(递归栈)。
2025-10-21 20:56:35
272
原创 【力扣hot100】48.旋转图像
文章摘要:本文介绍了如何原地顺时针旋转90度n×n二维矩阵的两种方法。第一种是暴力解法,通过复制原矩阵后逐个修改元素;第二种更高效的方法是先转置矩阵(行列互换),再水平翻转每一行。这两种方法都能实现矩阵的原地旋转,后者利用了矩阵变换的性质,代码更简洁高效。文章包含具体示例和C++实现代码,展示了从基础到优化的解题思路。
2025-10-20 18:58:25
322
原创 Qt QML调用FFmpeg命令行(提取封面图)
本文介绍了一个使用Qt调用FFmpeg命令行工具提取音频文件封面图的C++实现方案。文章首先对比了Qt自带的MediaPlayer与FFmpeg的功能差异,接着详细说明了如何创建FFmpeg命令行调用的封装类,包括头文件声明、函数实现和调用方法。核心部分展示了通过QProcess启动FFmpeg进程,解析文件路径,处理命令参数,并实现信号槽机制来获取处理结果。最后还提供了QML界面中显示封面图片的示例代码。该方案为Qt应用程序集成FFmpeg功能提供了实用参考。
2025-10-19 13:21:49
781
原创 Qt QML调用音乐api
本文介绍了如何为音乐播放器添加网络音乐获取功能,主要分为四个部分:1)前端通过TextField拼接API请求URL;2)C++后端使用QNetworkAccessManager处理网络请求和JSON数据解析;3)创建子线程处理耗时网络操作避免UI阻塞;4)QML接收处理后的数据并更新界面。文章详细说明了代码实现过程,包括URL拼接、网络请求发送、JSON解析、多线程处理以及前后端数据交互等关键环节,为开发网络音乐播放功能提供了完整的技术实现方案。
2025-10-17 14:35:22
739
原创 【力扣hot100】206.反转链表
本文介绍了单链表反转的递归解法。通过设置pre和cur两个指针,每次将当前节点的next指向前驱节点,然后递归处理后续节点。代码实现中定义reverse函数处理递归过程,当cur为空时返回pre作为新链表头节点。该方法避免了直接修改next指针导致的越界问题,时间复杂度O(n),空间复杂度O(n)(递归栈空间)。示例输入[1,2,3,4,5]经处理后输出[5,4,3,2,1]。
2025-10-15 13:24:03
282
原创 【力扣hot100】22.括号生成
本文介绍了一种生成有效括号组合的回溯算法。通过递归函数,在每一步选择添加左括号或右括号,同时确保左括号数量不超过n且始终多于右括号。当左右括号都用完时,将当前组合存入结果。该算法避免了无效组合(如"(()))")的产生,确保所有输出都是平衡的括号对。示例展示了n=3时生成5种有效组合的过程。这种方法通过剪枝优化了搜索空间,时间复杂度为O(4^n/√n)。
2025-10-14 13:52:29
300
原创 【力扣hot100】338. 比特位计数
十进制转二进制时,把每个数的二进制出现1的次数count加入答案数组ans。时间复杂度 O(nlogn)
2025-10-13 13:18:15
432
原创 Qt QML创建多线程(示例存读数据库)
本文介绍了使用Qt多线程解决GUI界面因数据库操作卡顿的问题。通过创建继承QObject的主线程和子线程类,利用信号槽机制实现线程间通信:主线程负责界面绘制,子线程处理耗时数据库操作。文章详细展示了线程类定义、数据库操作实现、信号槽连接方式,并提供了QML示例演示数据存读流程。这种架构将耗时任务移至子线程执行,保持界面响应流畅,同时支持并行处理多个任务,有效提升程序性能。
2025-10-01 13:11:04
1049
原创 【力扣hot100】46.全排列
本文介绍了两种生成数组全排列的方法。第一种采用回溯算法,通过维护访问数组vis来避免重复选择,当临时结果res大小等于原数组时保存结果,时间复杂度O(n!)。第二种利用STL的next_permutation函数,先排序数组后持续生成下一个排列直至穷尽,代码更简洁但底层实现原理类似回溯。两种方法都能正确输出所有可能排列,示例显示对[1,2,3]能生成6种排列。回溯法更具教学意义,而STL方法适合快速实现。
2025-09-30 13:24:21
403
原创 Qt QML解决动画状态竞争问题(阴影按钮示例)
本文针对Qt Quick动画中因鼠标快速移动导致的"卡住"问题,提出了解决方案。当开始和结束动画互相打断时,会产生动画状态竞争。作者通过一个阴影按钮的实例,展示了如何在鼠标移入/移出时分别停止对方动画(finanime.stop()/startanim.stop()),避免动画中断卡在中间状态。这种方法有效提升了UI交互的流畅度和响应速度。
2025-09-29 13:34:58
736
原创 【力扣hot100】617. 合并二叉树
本文介绍如何合并两棵二叉树。合并规则是:重叠节点值相加,非空节点直接保留。采用递归方法:先处理空节点情况,若两个节点都非空则新建节点,值为两者之和,并递归处理左右子树。示例展示了合并过程,如[1,3,2,5]和[2,1,3,null,4,null,7]合并结果为[3,4,5,5,4,null,7]。该解法时间复杂度为O(n),空间复杂度最坏情况下为O(n)。(148字)
2025-09-28 12:10:32
579
原创 【力扣hot100】461.汉明距离(基础位运算)
摘要:汉明距离指两个整数二进制表示中不同位的个数。通过异或运算得到差异位,再统计结果中1的个数即可。例如1(0001)和4(0100)异或得5(0101),有2个1,故汉明距离为2。代码实现中先将异或结果转为二进制字符串,再遍历统计1的个数。位运算相关知识包括:左移(×2)、右移(÷2)、异或(不同为1)、按位与(同为1)、按位或(有1为1)等基本操作。
2025-09-26 15:40:18
484
原创 【力扣hot100】226. 翻转二叉树
摘要:本文介绍如何翻转二叉树。通过递归方式,从根节点开始交换每个节点的左右子树指针,遇到空节点则终止递归。示例1将[4,2,7,1,3,6,9]翻转为[4,7,2,9,6,3,1]。代码使用swap函数交换指针,并递归处理左右子树,最终返回翻转后的根节点。
2025-09-23 13:28:40
598
原创 【力扣hot100】78.子集
该算法通过回溯法生成数组的所有子集。采用深度优先搜索策略,每次递归都将当前子集加入结果集,然后依次添加元素并递归处理后续元素,最后回溯移除元素。核心是遍历数组时,对每个元素进行"选"与"不选"两种操作,最终形成全部2^n个不重复子集。时间复杂度O(n*2^n),空间复杂度O(n)用于递归栈。算法优雅地避免了重复子集,适用于元素互不相同的数组。
2025-09-22 12:40:58
498
原创 Qt QML连接数据库如何解决重复创建连接问题
当类反复的实例化时,由于init()函数是在构造函数中被调用的原因,qt会反复的创建数据库连接。只使用特定连接的数据库了,至于连接名"music"是按自己需求随意写的。之前有写过用QML连接数据库的文章,后面项目做大了之后才发现。,原文不方便再次修改了,故再开了一篇单独码了下。
2025-08-31 13:08:19
1113
原创 Qt QML注册全局对象并调用其函数和属性
在QML中注册全局对象是一种非常便捷的方法。通过将c++类封装为全局对象,QML就可以在不创建实例的情况下直接调用其中的函数和属性。当然最关键的一点是,QML能通过访问同一个全局变量来实现数据同步,而不是各自维护一份,这自然顺带避免了多余的创建new实例和内存占用。
2025-08-30 13:40:14
1038
原创 Qt SQL中占位符的两种写法和值的绑定方式
这是我最常用的写法,理由也很单纯,快捷方便,用?表示位置即可,使用addBindValue()函数进行填值,参数则按顺序绑定,写法简洁直接,不费脑。
2025-08-29 13:16:26
710
原创 Qt QML中如何用c++读取本地音乐文件的文件信息(解决异步传输问题)
一般来说,都运行过getdata()函数了,不应该已经设置好值了吗,但由于异步传输的问题,在运行到onAccepted()中的console.log()时,所以,如果在数据还没处理完时,直接调用成员属性往往会出现类似undefined的现象,那该怎么办呢?第一次碰到异步传输的问题时确实很头疼,但懂得用信号解决问题后其实并算不上麻烦,在多加运用后也便好处理了。音视频的解码提取数据是异步传输的,即需要等到数据被处理完成后,qt才能接收到数据。,用在QML获取的本地音乐文件的URL作为参数。
2025-08-26 13:17:08
1373
原创 Qt QML 用Q_PROPERTY快捷访问c++属性
语句末尾按下alt+enter,选择Generate Missing Q_PROPERTY Members,qt会自动补全没有写的成员和函数声明,并带上函数实现。当然,在极其便利的反面,就是代码可能比较冗长,可能会实现多余的函数,而且性能开销可能会较大。这句语句也不用记,输入Q_PROPERTY是能够自动补全的,同时在输入变量名时qt也会同步帮你修改后续,只能说是相当的方便。在之前我写过如何调用函数,当时的属性都是手搓的,也就是自己写成员变量、变化信号和读写函数,但其实有一个很便捷的方法,即。
2025-08-25 13:17:26
946
原创 Qt QML中如何使用JS的箭头函数
熟练地使用箭头函数能够让代码更加精简,可读,这些是我在最近的项目中使用的体会,如果有更深入的理解,我会再分享给大家~,相比function,省略了关键词并能够沿用外层对象的this,下面给出箭头函数的。在QML中,我们一般用function去实现信号处理函数,那有没有跟简洁的写法呢?使用JS的箭头函数来写信号处理器。有的兄弟有的,QML支持并推荐。触发取决于绑定的信号。
2025-08-24 13:12:17
594
原创 Qt QML中JS代码块声明 动态类型变量 是用 let 还是 var ?
其实除了一的作用域,二和三与其说是特性,倒更容易变成“坑”,所以更推荐用let,毕竟作用域更加准确可控,当然了,动态类型,通俗来说相当于“万能类型”,即不需要主动的去声明类型,而是让类型在运行时由赋的值绑定。但在QML编程中,let和var感觉都作为动态类型被使用着,这俩之间有什么区别呢?在QML的属性声明中,只存在万能类型 property var。,即只在单个{...}中能够访问。,但会有警告,所以也不推荐这么做。,即在单个函数里都能生效。能在同一作用域重复声明。,即可以在定义前被访问。
2025-08-23 13:09:34
841
原创 Qt QML实现 无边框圆角窗口拖动(附窗口控制按钮)
这样我们就成功实现了无边框窗口拖动,和自定义的最大/小化和关闭按钮,但细致的地方,如MouseArea位置,button自定义等就都看自己需求而定了。我们平常用软件时应该有注意到他们都是没有边框的,而在一般情况下,qt运行的窗口都是有边框的并自带最大/小化和关闭按钮的,那如何实现无边框的效果呢?用一个圆角的Rectangle撑满Window,并将Window本身的color改为transparent。然后就会发现窗口的四角变成尖的了,不是很美观,但Window是没有radius属性的,那怎么办呢?
2025-08-22 13:51:47
828
原创 Qt QML中属性的自动过渡动画Behavior
所以Behavior是在特定的简单动画上的更优方案,我们可以用来大幅的简化代码,但在复杂可控的动画上,还是需要Animation类型来实现的。color的话需要ColorAnimation,NumberAnimation控制的是数值类型,如int、real等。Animation类型能够完成更加复杂的动画,它的属性更多,可控性也更高,能够通过成员函数自主控制动画。,对比来看就是,下面这串代码能做到与上面相同的效果。Behavior在简单的动画上能极大的精简动画代码。只要这个属性有变动,自动播放过渡动画。
2025-08-21 13:11:33
861
原创 Qt QML中的鼠标事件MouseArea的覆盖问题
一个最简单直接的方法,如果下层事件只需要响应click事件的话而上层不需要的话,使用propagateComposedEvents属性就能够快速的解决覆盖问题了下面是我写的一个示例,Button虽然作为子Item显示在Rectangle这个父Item上面,但鼠标事件的命中顺序是:最上层Item -> 向下找子Item -> 一旦接收事件就不会传递,所以Button无法响应任何鼠标事件。
2025-08-20 13:23:36
1081
原创 Lambda表达式的规范与用法
Lambda表达式是一种匿名函数,可以用来很方便快速的声明实现函数。可在lambda内部修改变量的值,而按值捕获变量则不能。捕获的变量名需要和前面的声明一致。[&]和[=]则默认捕获所有变量。,和正常声明函数是一样的,可置空。,并使用&可按引用捕获变量,当置空时,默认不捕获任何变量。,也是与普通函数是一样的。参数列表即传入的参数。如mutable,可。控制lambda行为。,影响捕获变量的权限。显式控制函数输出类型。
2025-08-15 18:31:39
1098
原创 Qt6 QML如何用SQLite数据库存储读取ListModel数据(解决重复创建连接问题)
上一篇码了下用json文件存取数据,这次换用SQLite数据库来存取,相比下更适用于大数据量和复杂操作的情况,但本文先只对存取写个示例:首先在xxx.pro中添加SQL支持之后在xxx.h中声明公有的save和load函数,还有私有的init函数和一个QSqlDatabase对象。
2025-08-14 13:08:10
1382
原创 Qt6 QML中如何用json文件存储读取ListModel数据
json文件存储可读性高,也不需要额外依赖,但数据类型转换繁琐,不适用于大数据量,对复杂操作也更乏力,所以视情况还是选用数据库更好,下一篇我也会码一下数据库存取。其实就是save函数的相反,将json文件中的QByteArray数据转换为QVariantList。先在xxx.cpp中实现,将QVariantList转换为QByteArray写入json文件。首先,在xxx.h中声明save和load函数(上篇写过怎么注册c++类)用Component.onCompleted让程序在打开时自动加载数据。
2025-08-12 13:15:27
816
原创 Qt6 QML用行为栈实现翻页回滚操作
翻页和回滚无疑是很多程序的重要功能,在QML中我们通常使用StackView来实现这些操作,但问题是调用时我们通常需要获取stack的实例引用,这对稍大点的项目就很繁琐冗余了。从本质上来说,行为栈就是存储封装函数来实现全局统一调用和延迟执行的,其中的函数不管是回滚,关闭还是自定义行为,都是存储操作压栈、记录执行顺序的,是个很值得掌握的方法。然后在push页面的同时,将pop函数封装为箭头函数压入行为栈。首先在注册好的单例对象中声明一个万能空数组,即是我们的行为栈。最后就能够在任意qml文件中调用了。
2025-08-11 18:22:23
928
原创 Qt6 QML如何注册单例对象
函数变成单例注册,第一个参数填注册文件地址,第二个参数填模块名,第三个填主版本号,第四个填次版本号,第五个填注册的类型名。然后编写Config.qml,加上自己想要的全局变量,信号等。再在main.cpp中注册,类似于c++类注册,最后在qml中导包调用既可。
2025-08-10 13:12:22
876
原创 Qt6 QML中c++类的信号与槽如何连接
首先在头文件中声明一个信号和一个函数然后在函数中发出信号最后在QML中实现槽槽函数是on+首字母大写的信号名。
2025-08-09 13:04:18
980
原创 Qt6 在QML中注册c++类并调用函数
>中的填类名,第一个""中填模块名(即import的名称),1和0为主次版本号,第二个""为QML中的类型(即类似QML中调用的API,,并在当前语句上按alt+enter,选择在xxx.cpp添加定义,能够快速写好函数框架,然后就可以在.cpp中写具体实现了。至此,我们已经成功注册了一个c++类,现在就可以在qml中使用import语句来导入模块了,并创建一个对象。然后就可以在main.cpp中注册了,先包含xxx.h,再。首先右键项目根目录,添加新文件,选择c++ class,
2025-08-07 13:23:54
872
原创 Qt6简单快速地给QML程序打包
windeployqt "填写至Desktop_Qt_6_8_3_MSVC2022_64bit-Release\release\xxx.exe的完整路径(需要写xxx.exe)" --qmldir "填写至文件夹中main.qml的完整路径(不需要写main.qml)"然后windeployqt就会自己把Qt程序运行需要的依赖全部补充到release文件夹中,使exe文件能够直接打开使用,把release文件夹直接压缩发给别人就好了。第一个路径是告诉windeployqt你需要打包的程序路径。
2025-07-28 16:49:49
959
原创 Qt 修改QML项目名称
看标题感觉有点离谱,但我确实没找到QT中修改QML项目名称的地方。首先在QT Creator中打开项目,在main.qml中在。,选择构建,之后重新构建,执行qmake,就能正常运行了。,再双击文件夹进入它的子目录,原项目名.pro.user。把文件夹名字改为新项目名。原构建文件夹build。
2025-07-17 14:23:47
1139
1
原创 Qt6 QML的封装自定义控件问题
起文件名(例:CustomButton1),在CustomButton1中编写自定义控件代码,最后在。自定义控件的封装能够大幅减少在main中的代码量,但QT5和QT6中的封装方法略微不同。,起个文件名(例:Custom),添加前缀(例:CustomButton),然后右击。那么直接在同目录下新建文件就不起效了,但方法也很简单。文件,就能够在main.qml中直接使用我们。新建文件的文件名(CustomButton),既可在main中直接调用,下面给出。参考在资源中引用图片的例子,我们在。
2025-07-16 13:45:23
906
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅