QT
东方忘忧
代码改变世界。
展开
-
QCombobox下拉选项挤在一起
如上图所示QCombobox如果挤在一起,一般原因是在设置QCombobox样式前设置了全局QSS样式。(经测试同一Qt版本在windows系统是没有这个问题的)原创 2024-08-15 11:13:50 · 215 阅读 · 0 评论 -
QT实现多摄像头监控
2、在del camera后选择一个对应IP后,点击del会自动删除对应摄像头的显示,且整体布局会自动调整。1、在add camera后面输入对应摄像头的IP后,点击add会自动布局显示。原创 2024-06-17 15:51:52 · 1044 阅读 · 2 评论 -
Qt进程间通信(QSharedMemory、QLocalSocket、QWebSocket、QProcess、D-BUS、QTcpSocket)
共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。原创 2024-06-12 18:40:29 · 1102 阅读 · 0 评论 -
Qt线程间的同步(QMutex、QReadWriteLock、QSemaphone、QWaitCondition、信号槽)
tryAcquire(int n = 1)尝试获取第n个资源,相当于开启n把锁,开锁成功后返回true,失败返回false,不阻塞。当多个线程同时使用同一个互斥锁时,首先抢到互斥锁的线程将互斥锁上锁,在互斥锁未解锁时,其他线程是不能使用该互斥锁的。:QSemaphore作为QT中的信号量,相当于多把互斥锁,QMutex只锁一次,而QSemaphore能锁多次,且控制多个条件。:告知不同的线程让谁先启动,等待条件变量满足后在启动,条件不满足则进入睡眠等待状态,不会往下执行,卡在wait()语句这一行。原创 2024-06-11 18:21:20 · 845 阅读 · 0 评论 -
Qt事件的详细介绍和原理
1、窗口系统事件spontaneous。2、异步事件PostEvent。3、同步事件SendEvent窗体系统事件spontaneous代表事件有:各类外设事件,如鼠标单双击、滚轮、移动,键盘按键等事件。使用场景:该类事件都是窗体系统进行捕获的,我们一般不需要进行操作,除非我们需要模拟鼠标、键盘的事件。异步事件PostEvent代表事件有:绘图时的update事件。使用场景:不需要马上回应的异步情况下,模拟各种事件。例子://模拟按键点击。原创 2024-06-11 16:41:46 · 818 阅读 · 0 评论 -
Qt学习教程目录
写了很多博客,有时候自己都忘了写了啥,所以做一个目录进行查找。原创 2023-12-29 18:04:17 · 1085 阅读 · 0 评论 -
QGraphicsItem实现不随场景缩放而缩放,支持任意图片,图形,文字。
的博客中讲解过通过painter->matrix().m11()获取缩放比例,然后对这个比例做处理来实现不随场景的缩放而缩放,但是也留了一个问题,那就是对于文字和不规则图形都没法实现不随场景的缩放而缩放。将要绘制的所有图形都先按照正常的比例进行绘制,绘制的画布设置为图片,这样相对于绘制了一张图片。然后将这张图片按照缩放比例来进行绘制。经过一段时间的研究用到另外一种方式来实现了不随场景缩放而缩放的功能,且支持任何图片,图形,文字。思路还是来源于我之前写的一篇文章的。原创 2023-12-19 15:58:58 · 684 阅读 · 0 评论 -
Qt提升绘制效率,绘制加速。
通过以上两个场景,得出结论,不管是绘制多个或者逻辑复杂的静态图形还是绘制多个动态图形时,都可以通过生成图片的形式来提升绘制效率。:我们绘制多个静态图形和绘制一张图片哪个更快。很明显绘制多个图形的时候要慢很多。所以我们将多个图形变成一张图片就能实现加速。在我们绘制一些复杂逻辑且数据量巨大的图形时,经常会出现流畅性问题,本文就是来进行讲解如何提升绘制效率的。但是将多个动态图形绘制成一张图片,我们可以控制图片生成速度来减少cpu。:绘制多个动态图形和将多个动态图形变成多张图片,效率还会有提升吗?原创 2023-12-12 11:44:11 · 1006 阅读 · 0 评论 -
Qt触摸屏双指缩放和单指移动界面(支持嵌入式设备)
2、在event事件管理器中接收触摸屏的三个事件,TouchBegin、TouchUpdate和TouchEnd。6、如果是单点触摸,通过比较手指放上去的位置和手指拖动时的位置来设置界面滚动条的位置。4、如果多点触摸,通过比较前后两次两点间触摸位置来判断是放大还是缩小。5、多点触摸时,会存在抖动情况,需要做防抖处理。3、判断单点触摸还是多点触摸。1、首先需要打开触摸屏功能。原创 2023-10-24 15:56:17 · 4824 阅读 · 6 评论 -
Qt判断一个点在多边形内还是外(支持凸边形和凹变形)
算法思想:如果点在多边形内部或者边上,那么点与多边形所有边组成的三角形面积和等于多边形面积。多边形的面积可以用叉积计算即连接坐标原点和各顶点形成向量,所有向量叉积的0.5的和即为多边形面积。算法思想:以被测点Q为端点,向任意方向作射线(一般水平向右作射线),统计该射线与多边形的交点数。算法思想:对于多边形(正向,即逆时针),如果一个点它的所有有向边的左边,那么这个点一定在多边形内部。算法思想:连接被测点与多边形所有顶点所形成的所有角的角度和在精度范围内等于则该点在多边形内,否则在多边形外。原创 2023-10-20 12:06:46 · 879 阅读 · 0 评论 -
Qt求多边形重心
在他的算法基础上翻译为Qt的语言。原创 2023-10-19 17:52:24 · 200 阅读 · 0 评论 -
QT实现凸凹边形等距缩放
5、如果小于等于90度,根据缩放距离、夹角和等间距求缩放后的点位置。7、判断凸凹边形后,根据缩放距离、夹角和等间距求缩放后的点位置。4、根据cosθ大小判断夹角为钝角还是锐角。公式判断多边形为凸边形还是凹变形。1、获取向量AB、BC的坐标。2、计算向量AB、BC的长度。6、如果大于90度,根据。原创 2023-10-17 10:38:35 · 256 阅读 · 0 评论 -
Qt5和Qt6的区别
之前有做过将项目从QT4迁移到QT5的操作,所以写了一篇QT4和Qt5的区别。在最近这一年接触过Qt6后,所以想要介绍一下Qt6和Qt5的区别,通过自己的试用感受和结合网上各路大佬的点拨,有了一个大概的了解。原创 2023-09-19 18:28:11 · 10333 阅读 · 0 评论 -
Qt自定义QSlider(支持水平垂直)
Qt本身有自己的QSlider,为什么我们还要自定义实现呢,因为Qt自带的QSlider存在一个问题,当首尾为圆角时,滑动滚动条到首尾时会出现圆角变成矩形的问题。当然如果QSS之间的margin和滑动条的圆角控制的好的话是不会出现这个问题的,但是我们一般都是按照美工设计来完成工作的,如果她的设计是必须一摸一样的话,这个margin和圆角配合不了出现以上问题的话,那我们就需要实现一个自定义的QSlider了。4、配合resizeEvent事件来实现自适应大小。3、配合mouse鼠标事件实现拖动功能。原创 2023-09-12 18:16:41 · 863 阅读 · 0 评论 -
QListView的使用(正逆序插入)
原因是QListWidget它的数据都绑定了一个Item控件,数据较多时,对Item操作就较多。而QListView的数据就只绑定了一个代理,大批量数据操作时,只在代理中绘制这些数据。QListView由于它是模型/视图的结构,所以它的数据交给了QAbstractListModel来处理,它的视图交给了QStyledItemDelegate来处理。//指定起始插入位置插入,该方法一般用于重写InsertRows后调用。//获取指定行列的model项,model项可以用来获取数据。//绘制Index项Ui。原创 2023-08-08 18:44:42 · 876 阅读 · 0 评论 -
QT实现中英文键盘
将字体库加载到一个Hash容器,字母和拼音作为key值,对应的中文作为value值。使用Qt中实现中英文键盘,支持各种linux嵌入式设备。原创 2023-08-02 14:47:24 · 973 阅读 · 2 评论 -
QTableWidget逆序插入(高性能插入)
当然我们正序的时候也可以用insertRow来实现,所以它跟setRowCount有什么区别,经过实际测试,我发现当数据量较大时,insertRow比setRowCount快很多,当然想想它的源码逻辑也能猜测到insertRow要快很多,因为setRowCount它需要先遍历操作找到第一条插入行,然后新增。通过以上的例子,是不是发现了正序和逆序它们操作方式不一样。正序是通过setRowCount来增加行的,逆序是通过insertRow来增加行的。但是逆序还需要更新编号和反向取数据。逆序插入删除选中行。原创 2023-07-26 18:32:32 · 658 阅读 · 0 评论 -
QT之自定义表格控件
继承QWidget来绘制的一款自定义控件,设计原因是因为Qt自带的QTableWidget的大批量操作很卡,特别是在嵌入式设备上时。2、支持各种颜色,字体,行列数设置。1、支持拖动自适应。原创 2023-07-20 15:09:54 · 720 阅读 · 0 评论 -
QT日志调试系统(前台、后台、文件查看调试信息)
通过qInstallMessageHandler获取Qt的打印信息,将这些打印信息存放到一个Widget中,实现不通过后台就能查看日志信息。原创 2023-07-20 10:42:06 · 566 阅读 · 0 评论 -
Qt 蓝牙实现连接
8、什么是透传模式,蓝牙分为两种模式,分别是透传模式和AT模式,透传模式就是蓝牙与蓝牙之间需要进行通信时设置的。发送数据完毕后,退出透传模式到AT模式,然后通过AT指令进行其它需要的操作。3、蓝牙与蓝牙之间的通信方式这个我们不用管,我们只需要分别配置两块板,让主机能够扫描到从机。1、蓝牙模块在嵌入式设备上是通过串口连接,这样我们跟蓝牙进行交互是通过串口进行交互的。2、蓝牙一般是两板,一般是主机和从机,每块板跟嵌入式核心板都是通过串口进行通信的。4、蓝牙板跟嵌入式核心板它们之间的通信协议是AT指令集。原创 2023-07-07 19:26:33 · 4158 阅读 · 1 评论 -
QT中代码设计和.ui文件设计的区别
但是在.ui中需要使用这个QWidget,我们需要把它进行提升,但是提升了后就会出现一个问题,Qt的提升是针对整个软件的,当我们存在两个项目时,你会发现所有提升的控件在所有的项目中都可以看到,如果项目1使用了项目2的提升控件就会出现编译问题,还有当项目1和项目2存在相同名称的QWidget都需要变成提升控件时,这个时候就会冲突了,会被覆盖。.ui文件的实现更快,但是代码很长,当然有好处有坏处,好处是ui_widget.h它里面支持了翻译功能,坏处是它的编码这块无法调整。1、难以跨编码不同的平台。原创 2023-07-06 11:12:00 · 1230 阅读 · 0 评论 -
QSS QCalendarWidget
知道了每个 widget 后,就可以像下面这样用 QSS 修改 QCalendarWidget 的样式了。以上QCalendarWidget各按键名称都是参考Qt源码的。原创 2023-06-25 16:17:18 · 956 阅读 · 0 评论 -
Qt绘制圆环(渐变圆环)
通过Qt的QPainterPath来实现,通过三角函数计算x,y坐标点围成一个环形区域。原创 2023-06-08 17:17:42 · 2020 阅读 · 1 评论 -
QSS QTableWidget样式设置
/Item不能编辑。水平滚动条的滑动块悬浮:QScrollBar::handle:vertical:horizontal。垂直滚动条的滑动块悬浮:QScrollBar::handle:vertical:hover。选中的表格:QTableWidget::item::selected。//显示/隐藏网格线。原创 2023-05-23 18:05:31 · 4802 阅读 · 2 评论 -
QT自定义控件折线图、趋势图。
这里主要介绍自绘的,它的优点是结构简单,代码逻辑好修改,容易定制,缺点是功能相对单一。三方的qcustomplot优点是功能丰富,性能突出。缺点是代码结构复杂,难以根据实际需求快速定制。这里提供两种实现方式,一直自绘的自定义控件,一直三方SDK(qcustomplot)。首先需要引入文件qcustomplot.h和qcustomplot.cpp。方法二:使用qcustomplot实现。//传入数据,根据实际情况添加。原创 2023-05-15 14:48:50 · 1360 阅读 · 0 评论 -
两种QGraphicsItem方式实现橡皮擦功能(矩形选中框)
通过以上GIF可以看出两款橡皮擦都具有位置拖动和大小拖动的功能,但是方法一的红色矩形框在一些特殊情况下的位置时,会出现无效的问题,但是方法二不存在这个问题。方法二:继承QGraphicsRectItem实现的橡皮擦功能。(gif中蓝色矩形框)方法一:继承QGraphicsItem实现橡皮擦功能。(gif中红色矩形框)原创 2023-05-15 09:58:31 · 838 阅读 · 0 评论 -
QGraphicsItem设置不可被移动和指定鼠标可以点击按键
一般还配合this->setFlag(QGraphicsItem::ItemIsMovable, movable);注意:这是可以通过”|“来设置多个按键的。原创 2023-04-20 14:46:40 · 1209 阅读 · 0 评论 -
Qt中英文切换(涉及多种场景)
场景1:UI文件中的控件翻译,主页.ui的上面介绍的方法直接加载即可,但是其它页面的.ui需要进入事件来进行配置。qt中英文切换涉及到一个软件两个文件,分别是QtLinguist、.ts文件和.qm文件。这步完成后基本上只有主页在.ui文件中的控件可以实时中英文切换,但是还有很多切换没有成功。场景2:主页和其它页非.ui文件中的控件(控件为成员对象时)场景3:主页和其它页非.ui文件中的控件(控件为局部对象时)它只能修改.ui中的中英文,非.ui的需要自己来加载。4、这个时候有其它场景的中英文切换如下。原创 2023-04-17 17:36:06 · 5740 阅读 · 9 评论 -
获取U盘盘符名称(U盘设备名)
然后使用grep "^/dev/sd"从众多存储设备中找到sd开头的设备,因为U盘名称一般为sda1,sda4,sdb1等等。基于Qt图形库实现的获取u盘名称的函数。命令行输入df查询所有存储设备。原创 2023-03-30 16:40:20 · 1856 阅读 · 0 评论 -
Qt中的QTcpSocket、QWebSocket和QLocalSocket
同时实现了QTcpSocket、QWebSocket和QLocalSocket的简单通讯deamon,支持自动获取本机ip,多个客户端交互。在这个基础上你可以自己加错误检测、心跳发送、包封装解析和客户端自动重连等功能。获取本机电脑ip:tcp服务器连接介绍:1、定义并创建接收的信号与槽:2、开启监听ip和端口3、接入连接进来的客户端,并配置接收。4、发送数据tcp客户端连接流程1、定义并连接ip和端口2、绑定连接、断开连接和接收的信号与槽3、发送websocket服务器连接流程1、定义原创 2023-03-07 10:17:35 · 1962 阅读 · 0 评论 -
QString转为2进制,8进制,10进制,16进制介绍
这个可以看出字符串转为二进制,如果字符串存的数据不是二进制数据,是无法通过toInt(&ok,2)来得到结果的,但8进制,10进制,16进制是可以得到结果的,因为它的存取格式符合8、10、16进制的格式。--------------------------数据 长度 进制 填充数据-----------------可以看出1f是正常的,1g的g超过了16进制的限制,不在16进制的格式中,所以无法转换。可以看出17是正常的,18的8超过了8进制的限制,不在8进制的格式中,所以无法转换。原创 2023-03-02 17:20:21 · 1980 阅读 · 0 评论 -
Qt下的8字节转6字节,转4字节,2字节。
8字节转为其它字节,将它以二进制的形式在字符串中记录,如12的二进制为0000000100000010,如果将它转为4字节,就是每个字节取末尾4个bit(小端情况下),然后记录到字符串中为“00010010”,这样就将所有的字节以二进制数据存到字符串中了,我们需要哪段就取哪段。在开发协议这块时,为了寻找一个快速的8字节转换其它字节的方式,百度许久也没有一款简洁好用,并且在Qt中也好调用的方法,所以设计出了以下方法,该方法支持8字节转为任意指定的字节长度。原创 2023-03-02 17:01:35 · 623 阅读 · 0 评论 -
Qt进程通信之共享内存(QSharedMemory)
比如单机上只有一个实例,该实例需要在启动的时候加载一大块资源到内存,那么,如果基于共享内存,将资源加载到共享内存,那么,下次启动的时候,只要version或者crc没变,就可以直接挂载使用,无需再次读入。比如程序启动需要加载cpu型号、内存信息、系统属性、配置文件数据等等时,软件第一次启动时先将数据加载到共享内存,后面启动时只需要从共享内存读取数据,提升程序的启动速度。两个进程同时挂载一片共享内存,进程A写、进程B读,就达到了通信效果,这种方案的好处是,读写都是基于内存操作,效率非常之高。原创 2023-02-27 15:28:35 · 3394 阅读 · 0 评论 -
Qt模拟键盘单击、组合键、鼠标移动的多种实现方式
这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值,跟Qt的sendEvent和postEvent差不多的原理。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。pInput 指向一个类型为INPUT的数组变量,该数组中的每个元素代表一个将要插入到线程事件中去的键盘或鼠标事件。原创 2023-02-22 10:41:26 · 5469 阅读 · 1 评论 -
QDateTime的11种显示方式
QDateTime datetime = QDateTime::currentDateTime();datetime.toString(“hh:mm:ss\nyyyy/MM/dd”);datetime.toString(“hh:mm:ss ap\nyyyy/MM/dd”);datetime.toString(“hh:mm:ss\nyyyy-MM-dd”);datetime.toString(“hh:mm:ss ap\nyyyy-MM-dd”);datetime.toString(“hh:mm\nyy原创 2023-02-20 15:25:35 · 1317 阅读 · 0 评论 -
QMap的升序排序,巧妙避开默认排序规则。
通过以上规律当我们需要顺序排序时,就不要将key值的类型定义为QString、QByteArray等字符串类型,而需要定义为int型。可以看出多个字符的key值,首字母排序后,如果首字母相同,则从第二个字母按照ASCII顺序来排序。从插入规则,对照ASCII码表不难看出map的排序都是按照key值首字母的顺序来排序的,结论:QMap的升序排序是指对key值的首字母的Ascii码顺序来确定的。以下通过一个示例来看看QMap怎么排序的。原创 2023-02-07 14:09:07 · 3031 阅读 · 0 评论 -
Qt BCC异或校验、LRC纵向冗余校验、CRC循环冗余校验
将每个字节数据求和结果与256求余,再按位取反加 1(256 - 余数)后即得到校验码。在工业领域Modbus协议Ascii模式采用该算法。将每个字节数据(一般是两个16进制的字符)进行异或后即得到校验码。适用于大多数要求不高的数据通讯,像很多单片机系统的串口通讯。原创 2023-02-01 16:22:24 · 1253 阅读 · 0 评论 -
linux下qt无法使用fcix输入中文
注意:Tools/QtCreator/lib/Qt/plugins/platforminputcontexts这个目录在低版本的Qt中是不存在的,需要将libfcitxplatforminputcontextplugin.so拷贝到Tools/QtCreator/bin/plugins/platforminputcontexts目录下。一、安装对应的输入法插件。原创 2023-01-31 11:11:17 · 800 阅读 · 0 评论 -
Qt opencv编译详细教程
4、安装cmake后,在QtCreator中添加cmake。库,我这里下载的是opencv-3.3.1版本。软件,Qt的环境安装部署,这里不做介绍。原创 2023-01-16 14:51:14 · 3169 阅读 · 0 评论 -
ubuntu下使用QMediaPlayer闪退。
在新装的ubuntu进行移植或者首次安装Qt的编译环境,当我们的Qt项目中存在使用QMediaPlayer对象的时候,会出现莫名其妙的闪退现象,就是找不到什么原因,qt又没有具体提示,这个时候你打开视频,会发现打开不了。经过仔细研究发现是缺少相关的视频库文件,这个时候我们安装一个视频软件,让这个软件自动把这个库进行安装。我安装的是VLC播放器。安装完毕后,我再次编译项目,执行程序,发现没有崩溃了。原创 2023-01-13 21:59:30 · 662 阅读 · 0 评论