- 博客(182)
- 收藏
- 关注
原创 53. QT插件开发--插件(动态库so)的调用与加载
在linux系统中加载动态库文件,需要使用dlopen函数和dlsym函数,其中dlopen用于打开指定路径下的so库文件,并返回一个句柄,dlsym根据返回的句柄查找so文件中暴漏在外部的接口函数,并进行调用。在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。中介绍了如何在QT中开发插件库,并提供外部接口调用。是so库暴漏出来的外部接口函数名称,两者一定要对应,否则会报错找不到指定的函数接口。是指定的库文件的路径。
2024-06-16 15:06:56
461
原创 52. QT插件开发--插件程序(带ui文件)的创建与编译
一般情况下,针对代码量比较小的QT程序不需要进行插件集成化开发,但是针对大型程序来说,代码结构比较复杂,使用插件开发的方式可以提高代码开发和维护效率,团队之间的分工合作也会更加的明确。创建完成后,一般会得到三个文件,其中两个头文件和一个源文件,头文件中会有一个命名为_global.h的文件,最终需要的也是这个文件,是用来将自己库中的接口向外暴漏出去,以使外部程序能够调用到这个接口。那么在得到so库文件之后,怎么才能让这个带有ui文件的库程序能够在其它主框架中进行调用并显示出来呢?
2024-06-16 14:28:09
213
原创 50. QT/QML中创建多线程的方式汇总
第一种:在定义类时继承 QThread 这个类,然后重写父类的虚函数 run(),将子线程需要执行的业务代码放到 run() 函数当中即可。第二种:使用moveToThread()函数将需要在子线程中执行的函数类移动到子线程中,这也是官方推荐的方式,比较灵活。首先,在QtCreator中新建一个QtQuick项目,需要实现的大致功能就是,在QML界面上点击按钮之后,会触发CPP后端的一个for循环函数(模拟耗时操作),同时将循环的次数显示在QML界面上。首先,在main.qml文件中。
2024-04-12 17:17:51
285
原创 49. QT中的HTTP通信与JSON数据格式解析
在请求获取网页数据时需要用到QNetworkAccessManager的get()方法,该方法需要传递一个QUrl参数,当数据访问结束之后,会触发QNetworkAccessManager::finished信号,此时可以在对应绑定的槽函数中去处理获取到的网页数据,finished信号当中会默认传递过来一个QNetworkReply类型的参数,访问到的所有网页数据都保存在这个参数当中。拿到上面的数据之后就可以自行处理了,比如简单的更新到UI界面上等。其次:利用get()函数获取网页数据。
2024-04-03 14:42:08
343
原创 16. QML中的一些粒子特效
在使用unity开发游戏时,都会涉及到一些特效的开发。实际上在QML中也提供了一些可以做特效的控件,称之为粒子系统。本篇博客主要记录一些使用粒子做特效的方式。
2024-02-28 15:13:08
627
原创 14. QML使用Flipable实现卡片翻转效果
分别用于展现正面和反面的界面状态,在实际中可以对这两个属性进行单独样式的设计,这样就可以实现在一个控件上的正反面设计不同的效果,同时结合动画更改控件的翻转角度,即可交替展现控件的正反面。,这个控件提供了两个属性,一个是。在QML中提供了一个控件。flipable控件效果。
2024-02-27 15:00:21
582
原创 10. Linux系统中wifi适配器找不到的解决方案
在linux系统中开启一个热点,一般有两种方式。一种使用create_ap在命令行中进行创建,另一种就是在系统自带的操作界面中手动开启。当手动开启热点时,有时会遇到wifi适配器找不到的问题,本博客记录一种可解决此问题的参考方案之一。服务重启后,关机,重启整个linux系统即可解决问题。
2024-02-24 10:09:46
1232
4
原创 17.自定义点击带波纹特效按钮
功能实现方式:在WaveButton.qml中使用动态创建组件的方式,创建WaveEffect.qml自定义控件,有关波纹的代码均在WaveEffect.qml中进行设计。此自定义按钮的大致效果为:当点击了按钮控件后,会在按钮中心生成一个类似波纹的特效并向四周扩散,同时按钮控件会有一个跳动的特效。
2024-02-06 13:21:56
384
原创 16. QML利用DropShadow自定义悬浮按钮
一般情况下,QML提供的按钮控件的外观效果比较单一,如果想要做出带有空间感的效果,需要自己定义组件实现。本篇博客记录两种效果的空间感按钮,主要借助阴影达到想要的效果。
2024-02-05 16:32:58
491
原创 12. openCV在QT环境中利用zBar开发库实现二维码内容识别
本篇博客仅记录如何使用zBar库进行二维码内容的识别,其中牵扯到的一些其它知识点,比如二维码区域检测、zBar库开发环境配置等可以参考本专栏的其它相关博客,此篇博客不再赘述。博客中代码功能:手动选择一张包含二维码的图片,会将检测到的二维码区域单独显示出来,并将二维码中包含的信息显示到一个button上。图像当作参数传入,进行信息提取,注意:使用。经过上述操作即可识别出二维码中的信息!是最终需要用来识别的二维码图像。检测时,待检测的图像必须转换为。
2024-01-23 18:00:15
480
原创 48.Qt for Android实用小技巧
但是,为Android项目配置了这个文件之后,一些关于Android的相关设置才能进行,因为这个文件相当于开发的Android程序的配置文件。开发的Android程序一般情况下是需要获得设备的某种权限的,不然很可能操作上会遇到问题,比如读写设备上的文件权限,蓝牙状态获取权限,wifi状态获取权限等。使用Qt开发的Android程序,当把编译的apk文件安装到设备上之后,默认显示的程序名称是在qt中创建项目时的项目名称,如果想让程序安装后有自己的名称,这时就需要单独设置了。的文件夹,这个文件夹是创建。
2024-01-11 17:27:12
216
原创 11. 在Opencv中利用仿射变换处理二维码变形问题
在前一篇博客中记录了如何在一张图片中单独提取出二维码区域,考虑一种情况:如果二维码图片拍摄时并非是正对着二维码拍摄的,那么整张图片相对来说就发生了一定的倾斜角度,最终截取到的二维码也是有一定的变形的。针对形状发生变化的二维码,如果想把它调整归正,可以使用仿射变换对图像就行矫正,某种程度上可以提高二维码最终的识别精度。
2024-01-09 11:04:30
870
原创 9. linux系统下在Qt中配置Zbar条形码/二维码扫描开发环境
虽然现阶段OpenCV的高版本也有提供二维码扫描的功能,但是其在速度和精准度方面都远低于Zbar,不过Zbar的精准识别是依赖于一张图片中二维码的区域要占用40%-100%的空间,这样标准的二维码对于Zbar的识别是非常精准的。而实际应用中,拍摄一张带有二维码的图像进行识别,往往这张图像会包含一些其他的额外信息,所以就需要对原始含有二维码的图像进行处理,只保留其中的二维码区域,而图像处理方面OpenCV是强项,所以可以将两者结合开发,功能实现精准扫描的功能需求。,本篇博客以此种方式进行配置。
2024-01-08 18:00:13
564
原创 10. Opencv检测并截取图中二维码
在二维码扫描功能开发中,使用相机扫描图片时,往往图片中的信息比较多样,可能会造成二维码检测失败的问题。:根据二维码的特征 --> 三个角点都有一个 “回” 字形图案,可以借助这三个 ‘‘回’’ 字形图案定位到二维码的具体位置,然后使用OpenCV中的 “抠图” 功能,根据坐标值把二维图从原图中抠出来。字形的大致位置,接下来就是要使用上面的处理结果图再次进行预处理,查找轮廓等方式,寻找包围这三个。本博客中先是检测得到所有的轮廓,然后在找到所有的父轮廓,根据父轮廓的索引号将。字形轮廓绘制出来,得到。
2023-12-28 15:21:17
991
1
原创 8.linux系统使用Qt开发Android配置opencv for android开发环境
在linux系统中使用qt开发android程序时,如果需要使用到opencv,是需要配置开发环境的。前面一篇文章记录了在linux中使用cmake工具配置opencv的方式,这种方式并不适合开发andrroid,在opencv的官网上有专门用于开发android的opencv包,下载之后按照本篇博客记录的方式即可实现环境配置。目前opencv的最新版本已经在4.X以上了,但是高版本的opencv在结合QT使用时会存在一些编译报错的问题,低版本的会更稳定一些。
2023-12-21 11:39:19
646
原创 3.基于对象的编程风格
基于对象:子类中包含一个父类的成员变量,同时子类中编写实际函数,并在子类构造函数内将实际函数以回调函数的形式注册到父类成员变量中。此博客记录如何以基于对象的方式进行编程,分别以旧的和最新的C++版本进行实现。面向对象:子类继承父类,实现父类提供的虚函数。
2023-12-08 14:38:31
100
原创 47. QT Android针对Java代码常见接口类型的调用方式总结
可以很方便的对java代码进行调用,但是QT提供的这个类使用起来也并不是很简单,需要根据不同的java接口形式传入不同的参数,比如说在java中定义了一个无参无返回值的接口和一个无参有返回值的接口,又或者定义的还有带参带返回值的接口,不同的接口有不同的调用方式,本篇博客对常用的接口类型的调用方式进行了简单的归类,方便学习参考!先总结这些,后面有需要再追加…在QT中提供了一个接口。
2023-11-28 17:18:31
179
原创 46. Qt Android调用Java代码进行辅助开发 -- 框架搭建
在Qt中提供了调用Java代码的接口,比较方便。然后创建一个CPP文件用于辅助QML端调用java代码,本例创建的.cpp文件命名为javahandler.cpp,在QT中提供了一个接口。,注意从这个文件夹开始,文件夹的名称就是后面java代码的包名了,这个包名是要添加到java代码中的,比如java代码所在路径为。此时已经创建了一个java文件,还需要将这个文件的设定为启动时自动加载的默认文件,回到之前的android配置文件中,点击下图中。文件夹,多出了其它的一些文件,这些多余的文件是因为创建。
2023-11-22 14:23:37
204
原创 44. Adb调试QT开发的Android程序实用小技巧汇总
一般在QT程序中如果出现了BUG,都会尝试看一下某个变量值的状态,使用 console.log() 输出一些信息方便自己快速定位出错的原因。不像在linux或者windows系统中,可以利用QtCreator软件本身进行一些调试,安卓应用一旦在系统中安装后,如果运行中途出现什么BUG,定位问题所在很麻烦。关于android调试,在没有终端的情况下,也可以使用弹框的方式进行调试,就是自定义一个弹框显示的qml控件,把需要输出的调试信息显示到这个控件上,以弹框的形式显示出来。
2023-11-15 11:13:27
380
1
原创 9. linux系统设置开机自启动发射热点
某种情况下需要使用wifi进行通信时,可以在linux系统中发射一个热点让以使别的设备能够连接,然后进行通信。一般情况下可以在有无线wifi发射器的情况下,每次linux系统开机后,手动设置开启热点,但这种方式比较麻烦,可以通过命令脚本的形式在系统开机后自动开启热点,方便使用。上面命令行中:selfHot为热点名称,12345678为热点连接密码。此时打开其它的设备,即可搜索到热点 selfHot。以后开机后启动,linux系统即可自动创建热点了。创建开机自启动脚本,实现开机自动启动热点。
2023-10-31 17:19:04
911
1
原创 43. QT客户端中使用TCP进行高频率的发送消息导致服务端接收信息不完全问题
所遇场景:在嵌入式开发中,一般情况下客户端和服务端均在一个工控机系统内,此时两者的通信实现如果采用TCP的方式,通信频率的高低对于信息的接收影响不是很大,在QT中开发的客户端使用TCP发送的指令,在服务端能够完整的接收。**第三步:**将指令集进行分割,并取出第一条指令(不出意外,如果上一个指令集的最后一条指令是不完整的,那么这一次的指令集的第一条指令也是不完整的,两个不完整的指令组合在一起就是完整的指令),将第一条指令和上面缓冲对象保存的不完整指令进行拼接,组合成完整指令。
2023-10-30 11:09:26
486
原创 6. Python使用Asyncio开发TCP服务器简单案例
在Python中开发TCP/IP服务器有两种方式,一种使用Socket,需要在py文件中引入对应的socket包,这种方式只能执行单项任务;另一种方式使用Asyncio异步编程,可以一次创建多个服务器执行不同的任务。运行此脚本即可接受客户端的正常连接和信息传输。创建一个tcp服务器,并实现数据的接受和发送。
2023-10-10 17:14:25
1236
原创 42. QT中开发Android配置QFtp功能时遇到的编译问题
此问题仅适用在QT中开发Android程序时,需要适用QFtp功能的情况。一般情况下,如果开发的是Windows或者Linux系统下的程序,可能不会出现该问题。将和QFtp相关的代码文件,单独放到一个文件夹中,命名必须是。然后再添加到工程项目中进行使用,即可解决上述的问题。文件是空文件,在android环境下无法正常编译。根据报错信息可以看到,是因为。
2023-10-10 14:15:56
225
原创 41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传
经过上述步骤的操作,linux系统即可被有ftp功能的客户端连接到,实现不同系统的文件互传。此案例以在windows系统中开发的qt小程序为例,连接虚拟机中的linux系统,并添加文件上传功能。这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。在QT中使用开发ftp的功能,最直接的方式是把下载的。使用上述命令安装后,系统中会有一个默认的配置文件。直接添加引入到项目中,主要包括四个文件,分别为。案例部分介绍的比较精简,详细的可以看博文。
2023-09-20 16:30:20
677
原创 3. C++调试时显示代码所在文件 / 函数 / 行号信息
/ 使用的...符号是可变参函数传参的写法,可以使用__VA_ARGS__接收参数} // 使用的...符号是可变参函数传参的写法,可以使用__VA_ARGS__接收参数 # define selfTest(. . .) selfTest(__VA_ARGS__ , __FILE__ , __func__ , __LINE__) int main() {//上面进行宏定义后,此行代码相当于selfTest(3,8,__FILE__,__func__,__LINE__) }
2023-09-05 13:32:54
516
原创 40. QML中使用Settings类保存一些设置时的注意事项
软件开发中一些参数设置有时可以使用数据库来保存这些变量,但在QML中提供了一个Settings类,可以轻松实现一些简单数据的保存。它的实现原理是在指定文件夹内或者默认文件夹内创建一个**.ini**结尾的windows系统文件,为系统的初始化文件,在其中保存数据,软件启动时会首先在这个文件内调用相关参数变量进行使用。注意:在第一次设置属性时,一定要先考虑好属性的值,因为一旦设定,修改起来就比较麻烦比如在文件中写入下面的代码:软件运行后会发现在项目build文件夹下会生产一个配置文件,打开如下图所示:
2023-08-24 17:14:31
301
原创 14. 利用Canvas自制时钟组件
在绘制相关元素时有两种方式:一种时在同一个canvas中绘制所有的部件元素,这样需要不断的对画笔和画布的属性进行保存和恢复,容易混乱;另一种就是创建多个canvas组件,每一部分的元素绘制都在各自的画布进行绘制,逻辑比较清晰,但是canvas组件会相对较多,本文使用的是第二种方式。在自定义时钟组件时,使用到的基本控件主要是。
2023-08-21 14:08:54
191
原创 39. Linux系统下在Qt5.9.9中搭建Android开发环境
安装完成后会在当前安装目录内出现一个新的文件夹,依次进入目录**/Tools/QtCreator/bin/**,找到其中的qtcreator可执行文件,执行这个文件即可打开qt的开发工具。大致安装的步骤如下:①安装Qt5.9.9,②安装jdk,③安装ndk,④安装sdk,⑤在qt中配置前面安装的环境路径。qtcreator的运行,需要以超级用户的方式进行运行,否则sdk的路径可能无法访问。在上图中进行相关组件的选择,因为配置的是android的开发环境,所以上面。至此,sdk安装完毕!
2023-07-26 17:17:00
1167
原创 8. Vmvare中重新分配Linux系统的分区空间大小
上述操作结束后,虚拟机的相关内存表面上已经更改了,但实际上虚拟机内部并不知道自己的内存发生了变化,还需要开启当前虚拟机进行实际的空间分配。在打开的页面中鼠标左键拖动上卖弄磁盘条右侧的箭头来更改空间大小,更改后点击右下角的。打开虚拟机设置页面之后,在左侧页面先选择。然后选择其中的某一个分区,右键鼠标,选择。上述操作结束后,即可完成内存空间的更改。先关闭当前虚拟机,打开首页,点击。上述操作完成后,在左侧选择。选项,然后点击右侧的。
2023-07-25 11:39:21
1780
原创 7. QT环境下使用OPenCV(对图像本身的操作--二值化、混合、合并拼接)
混合是将两张尺寸大小一致的图像叠加在一起,只是每张图像的透明度会不一样,从而达到两张图像混合在一起的效果,注意两张图像混合在一起显示的前提是要保证两张图像的尺寸大小一致。此操作和混合图像不同,合并图像类似于拼接图像,可以将两张或者多张图像拼接到一起进行显示,最常见的就是多路监控系统同时显示在一张屏幕上,或者多宫格图像拼接等。
2023-07-18 10:25:30
289
原创 38. QT在工控机Linux系统上调试机器人注意事项
如果只是手动更改了文件夹的名称,而在QtCreator中的配置中没有更改路径名称,则在代码编译时QtCreator会因为找不到路径的原因,它会自定按照原来的路径重新创建新的文件夹进行保存,那么此时如果我们需要拿到编译后的可执行文件就需要去实际项目编译保存的路径去找,否则很容易出错导致自己想要的程序不是最新编译的。解决这个问题的终极方式就是在QtCreator编辑器中手动指定编译文件的保存路径,如下图所示,在下图的方框中指定编译文件的保存路径,每次编译完成后,此路径下的编译文件才是对应最新的结果。
2023-07-12 17:38:46
529
原创 6. git 从分支拉取代码到本地
在使用git拉取远程仓库时,一般情况下在本地文件夹中使用git绑定远程仓库后拉取代码默认是从主分支拉取的代码,但仓库中可能有多个分支,有时需要从子分支中拉取代码进行开发。上述命令执行后,即可在本地文件夹内看到子分支中的所有内容,且当前本地仓库也与远程仓库中的子分支进行了关联。添加后开始拉取子分支的代码,注意这里不要使用。
2023-07-07 11:50:48
2272
原创 6. QT环境下使用OPenCV(利用鼠标实现图像的ROI区域选择)
如果需要在一张图像上绘制多个矩形框,那么就需要时刻保存上一帧绘制过的带有矩形框的图像,需要添加一个新的全局变量rectedImage,并更改回调函数中的内容,添加一层判断,当第一次绘制后,给rectedImage进行赋值,如果rectedImage为空时就在原始图像上绘制,如果不为空,就在rectedImage图像上绘制。因为要在图像上实现鼠标框选的动作,那么必然需要记录鼠标左键按下和松开时的坐标,而且当矩形框绘制到图像上之后需要不停的刷新窗口上的图像帧(后面文章会讲到),所以需要在。
2023-07-06 16:23:01
1164
原创 37. QT中使用QFtp实现文件传输2 -- 远程服务器文件或文件夹下载到本地
网上很多关于使用QFtp这个类实现文件或者文件夹的远程服务器上传的案例,但很少有关于如何下载文件,下载整个文件夹的案例甚至更少,本篇文章中使用到的方法,在下载单个文件是比较简单的,而在下载整个文件夹时采用比较曲折的方式,原因在于ftp整个类如果依然采用递归的方式去获取远程服务器中文件夹中的信息,会造成QT中信号槽函数的多次连接,出现问题。当中,当这一步骤执行完毕后,需要去遍历这个容器,每获取一个文件夹路径,就要根据这个路径的文件夹相关信息在本地保存路径中创建相同名称的文件夹,然后创建新的临时辅助。
2023-07-03 16:51:26
1038
原创 36. QT中使用QFtp实现文件传输1 -- 本地文件或文件夹上传到远程服务器
在对ftp的源码进行编译后,得到的文件中其实有很多功能函数提供给我们使用,为了对源代码结构进行保护,在自己项目中可以在源代码的基础上进行二次封装,创建自己的ftp功能类。本项目中创建了一个ftpUpload//上传单个文件 Q_INVOKABLE void upLoadSingleFile(QString localFilePath , QString remoteFilePath);
2023-07-03 14:22:57
1185
1
原创 5. QT环境下使用OPenCV(基于TCP实现摄像头图像数据的多线程传输)
在QT的多线程开发当中,有两种方式可以创建子线程,一种是继承QThread这个类,然后重新其run()函数,需要在子线程中执行的代码放置在run()函数内部,在启动线程时只需要调用其start()方法即可,但这种方式在结合tcp通信一起使用时容易出现错误,会报错说socket通信不在同一个线程内。另一种创建子线程的方式是将自定义的类继承自QObject,然后使用moveToThread()函数将其移动到创建的子线程管理器中,转移之后,此自定义类中的所有功能代码在运行时都会在子线程中进行。
2023-06-25 17:11:08
1825
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人