截止至2020年8月,Qt的最新版本是5.15.0,但仍有很多资料是基于Qt4,为了避免大家误入歧途,所以写了这篇文章。
Qt 是一个跨平台的C++图形用户界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
一、功能特点 超过160个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mi
真的是太难了!这个难不是说框架多难,开发多难,而是可供参考的资料太少了。一方面是官方文档的缺失,一方面是中文文档的缺失,还有一方面则是示例的缺失。
下载地址:https://download.qt.io/archive/qt/5.14/
之前就提过,Qt的属性机制强大到爆,这次的动态属性功能就是要让他爆,很难想象只要一行代码即可widget->setProperty("value", value);没错就这么简单,调用弱属性机制,可以直接控制控件中的所有属性,设计这个机制的人绝对是天才,直接跪了。至于具体底层是怎么实现的,这个可以先不管,也没有太多精力再去研究Qt的源码了,那个源码非常庞大,研究源码的时候最快的办法是搜索直接定位对应文件。本设计器除了提供文本框输入值进行动态改变控件属性以外,还提供了了滑动条、随机模拟数据、串口采集数据、网络采集数据、数据库采集数据等多种方式获取数据源。
在上一篇文章中就提到过,使用qtpropertybrowser来加载属性,对应加载到的属性是英文的,也就是控件类中Q_PROPERTY描述的变量名称,如何变成中文或者其他语言显示呢?这个就需要研究qtpropertybrowser的源码了,通过研究发现,在QtObjectControllerPrivate类中负责对控件的属性名称进行遍历,然后发送到QtVariantPropertyManager进行统一的管理,那只要将这里的属性名称进行映射就行了,对应的英文到中文或者其他语言都可以,甚至枚举值的下拉框也可以在这里换成中文的。曾经想过用翻译的机制,后面发现路很漫长,而且最终还是需要映射转换,看过QtDesigner的源码,里边最终也是将翻译文件中的对应项转换成中文的。
哈喽,小伙伴们,日常设计中,当有显示屏的时候,UI的设计不可避免,如何快速设计出优美的界面呢,本次给大家分享一个开源的UI图形库,Littlegui(LVGL),目前有很多优美的开源例程,用起来还是非常便捷的,本次主要给大家介绍如何在QT平台上实现LVGL的设计效果模拟,是可以直接移植到嵌入式平台的。
目前开源的二维CAD有QCAD、LibreCAD等,且LibreCAD可以说是QCAD的分支版本。对比这款开源软件,发现QCAD的功能与操作习惯和AutoCAD更接近。LibreCAD是纯C++开发,而QCAD使用了Qt的Script模块,使用了C++和Javascript脚本两种开发方式。我觉得使用脚本来扩展功能比纯C++开发效率会高点,因为这些开源项目源码都很大,编译比较花时间。如果使用脚本来开发的话,没有编译时间,可以边写脚本边测试,很方便。
近一段时间,更多的接触了linux系统,之前的印象中,linux系统更偏向于命令行模式,更多的是作为服务器来使用,现在却作为跟windows一样的界面操作系统来使用,不得不说还是带来一定的冲击的。
QGit是一款由Marco Costalba用Qt和C++写的开源的图形界面 Git 客户端。它是一款可以在图形界面环境下更好地提供浏览版本历史、查看提交记录和文件补丁的客户端。它利用git命令行来执行并显示输出。它有一些常规的功能像浏览版本历史、比较、文件历史、文件标注、归档树。我们可以格式化并用选中的提交应用补丁,在两个或多个实例之间拖拽并提交等等。它允许我们用它内置的生成器来创建自定义的按钮去执行特定的命令。
降龙算法尝鲜版项目是个C++/QT机器视觉软开教学项目,这次V1.4.0.0版本的升级优化,主要是针对代码的规范性,风格统一化,以及可阅读性、可学习性做的优化。为了代码可阅读性,我将整个软件的所有.ui文件都去除了,采用纯代码手写界面的方式,并加以注释。
Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
为了帮助准备过渡到Qt 6,在Qt 5.15版本中已将许多将从Qt 6.0中删除的类和成员函数标记为已弃用。除非您在项目中定义QT_NO_DEPRECATED_WARNINGS,否则对于使用任何不推荐使用的API的代码,您都会收到编译器警告。这些警告将说明要改用哪个API。要完全禁用所有不推荐使用的API,请使用QT_DISABLE_DEPRECATED_BEFORE宏。
在Windows下,Qt官网默认提供的二进制版本大多是32位,目前(2015.01.24)只对VS2013提供了64位版本,如下图所示:
入手pyqt没有几天,想把pyqt系类基础挨个实践一遍。 这一节是pyqt5的QPainter绘制基础图形。 开发环境:
数据源是组态软件的核心灵魂,少了数据源,组态就是个花架子没卵用,一般数据源有三种方式获取,串口、网络、数据库,至于数据规则是什么,这个用户自己指定,本设计器全部采用第一个字节作为数据来演示。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。
自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDesigner一样,可以方便的拖曳控件,改变属性,立即应用,并导出到文件方便下次直接加载,这个设计器有点像组态中的一个雏形,提供了基本的加载控件,导入导出数据,数据源绑定等。
上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。这里需要注意的是dragEnterEvent是必须的,很多人以为拖曳只要实现dropEvent就可以了,其实不行的,没有效果的,需要先dragEnterEvent来过滤好了执行event->accept()才行,不然根本没有效果,很多人尤其是初学者都挂在这里,我就是在这里摔了一跤,好疼!
通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐标到数据库,下次打开直接加载,在一些安防项目、电力项目、环境监测等上面大量运用,有时候设备对应了多种类型,以前做的办法是将这个移动的代码直接封装在对应设备的自定义控件中,有个巨大缺点就是如果再新增加一个控件,又需要重复的代码加到控件中才行,可否将这个功能独立出来,只要传入控件就行呢,当然可以,比如我写过很多自定义控件,现在需要控件放到某个容器中能自由拖动,只需要new出通用移动类来就行。
这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标签设置,这个控件的难度系数接近0,初学者都会,其实网上搜索也很多人提供了绘制的方法,就是枚举QColor::colorNames()拿到所有的内置的颜色,然后生成对应的图片作为icon设置到下拉框的item中去,对应icon的宽高由控件本身的宽高决定,本控件继承自qcombobox控件,完全保留了该控件的所有特性,同时新增了颜色改变信号,以便用户使用。
默认的qcombobox控件,如果元素item中的内容过长超过控件本身的宽度的话,会自动切掉变成省略号显示,有些应用场景不希望是省略号显示,希望有多长就显示多长,还有一种应用场景是需要设置下拉元素的高度为指定的高度,比如很多触摸屏上,如果程序中的下拉框太小,手指很不好点,很容易误操作,为了杜绝这种误操作,可以将下拉框高度变大,当然更好的办法还是类似于手机app一样弹出一个大大的滑动选择框会更好。
加载插件是整个属性设计器的第一步要打通的功能,插件中的控件都加载不了,后面就别搞别玩下去了没法玩的,要从一个动态库中加载出来控件,肯定需要用到反射机制,以前做.NET开发的时候就觉得反射这个东西相当强大,居然可以读取DLL加载出来控件,现在用Qt,发现Qt也有反射机制,也许这东东可能各大开发语言平台都具备吧,Qt反射对应的类叫QMetaObject,着实强大,其实整个Qt开发框架也是超级强大的,本人自从转为Qt开发为主后,就深深的爱上了她,在其他跨平台的GUI开发框架平台面前,都会被Qt秒成渣,Qt的跨平台性是毋庸置疑的,几十兆的内存存储空间即可运行,尤其是嵌入式linux这种资源相当紧张的情况下,Qt的性能发挥到极致。
演示视频:http://mpvideo.qpic.cn/0bf2oaaoaaaaaeabaizitvpva4gd4byabyaa.f10002.mp4? Deep IN深度Linux是优秀的国产操作系
Qt是一个跨平台的C++应用程序开发框架,用它可以轻易做出艺术级的图形界面;Qt 支持跨平台体现在它可以支持各大主流操作系统(Windows、Linux、Unix、嵌入式系统等)
如果一个个的拷贝,不知道要哪些,不要哪些Dll,一个个找也麻烦。好在QT提供了windeployqt.exe程序专门用来提取相关的DLL。但是这还是有个坑,这里记录下留作以后使用注意。
上次在写可视化数据大屏电子看板项目的时候,为了逐步移除对QChart的依赖(主要是因为QChart真的太垃圾了,是所有Qt的模块中源码最烂的一个,看过源码的人没有一个不吐槽,不仅不支持10W级别的数据量曲线展示,居然一个饼图控件,文字部分的展示还用QLabel来显示的,这么低效率的方式都有),起初曲线图和柱状图等都用QCustomPlot替代了,就剩一个饼图需要自己用无敌的QPainter来绘制了,绘制对应的背景区域难度不大,稍微会用QPainter的人都可以实现,用的就是drawPie绘制即可,关键是如何在自己所在的区域绘制对应的文字和百分比,这个需要找到对应区域,然后找到合理的位置摆放文字,这个可能就需要用到一点数学知识了,从圆中心开始,给定对应的角度,对应的偏离值,计算偏离值对应的中心点坐标,此坐标作为绘制文字区域的中心,然后四周扩散一定的距离即可。
本文介绍了一种基于Qt的Webkit框架实现的浏览器方案,该方案可以加载和渲染网页,支持JavaScript等脚本语言的解析,实现了对网页的爬取和模拟点击等操作。该方案具有高度可扩展性和可定制性,可以广泛应用于各种不同的应用场景。
PyQt5 有两种安装方式,一种是从官网下载源码安装,另外一种是使用 pip 安装。
平铺背景控件,主要的应用场景是作为画布出现,黑白相间的背景图,然后上面可以放置图片图形等,使得看起来更美观,比如PS软件新建图层以后的背景,FireWorks软件新建画布以后的透明背景,ICO制作软件新建画布以后的背景,都会采用一个黑白相间的背景。尽管本人用QPainter很多年,后面在翻阅QPainter自带的函数中才发现居然QPainter自带了这个绘制平铺背景的函数,擦,他么叫drawTiledPixmap,Qt不愧是跨平台GUI开发中的佼佼者,这些东西居然都考虑到了,说到考虑的周到,Qt中连size和count和length都完美的封装了,适合不同人群的使用习惯,这个考虑也是非常周到的。drawTiledPixmap就两个参数,第一个参数是要绘制的区域,第二个参数是要绘制的图片,图片不足会自动拷贝填充,所以如果提供的是两个交替颜色的背景图片,就会依次绘制形成平铺背景的效果,为了使得颜色可以控制,本控件增加了交替颜色的设置,可以自行传入两种颜色作为交替颜色,在程序内部自动生成要绘制的图片。
在上一篇文章写了个高仿WIN10系统的光晕日历,这次来绘制一个光晕的时钟,也是在某些网页上看到的效果,时分秒分别以进度条的形式来绘制,而且这个进度条带有光晕效果,中间的日期时间文字也是光晕效果,整体看起来有点科幻的感觉,本控件没有什么技术难点,如果真要有难点的话也就是如何产生这个光晕效果,在使用painter绘制的时候,设置画笔,可以设置brush,brush可以是各种渐变效果,这个就非常强大了,主要有线性渐变、圆形渐变、锥形渐变,这三种渐变用得好,各种效果都得心应手随手拈来。
下载NOKIA网站上的QT SDK,解压或安装到相关目录。 本文以QT 4.6.2为例,下载地址:http://get.qt.nokia.com/qt/source/qt-win-opensource-4.6.2-vs2008.exe
能够导出控件布局和属性设置数据到xml文件或者其他文件,也是一个非常实用的功能,类似于QtDesigner中把页面设计好以后生成的.ui结尾的文件,其实就是xml文件,按照约定的规则存储好控件名称和属性名称及对应的属性值,然后打开的时候按照这个规则取出来就行了。每个控件还有固定的几个数据需要存储,比如XY轴和对应的宽度高度,然后在xml数据文件的最开始还可以存储整个画布的宽度高度以便其他用途。导出到xml格式,是为了方便解析,毕竟xml数据格式的解析,各种语言平台都有,而且都是非常成熟快速的。其实还可以考虑存储到数据库,这样就更加强大了,能够存储的东西更多,可以干的事情更多。
LVGL的作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor,LVGL用C语言编写,以实现最大的兼容性(与C ++兼容),模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计,同时LVGL作为一个图形库,它自带着接近三十多种小工具可以供开发者使用。这些强大的构建块按钮搭配上带有非常丝滑的动画以及可以做到平滑滚动的高级图形,同时兼具着不高的配置要求以及开源属性,显著的优势使得LVGL蔚然成风,成为广大开发者在选择GUI时的第一选择。
上一篇文章负责把设计好的控件数据导出到了xml文件,本偏文章负责把导出的xml数据文件导入,然后在画布上自动生成对应的控件,Qt内置的xml数据解析功能,非常强大,都封装在QtXml组件中,Qt有个好处就是,封装了众多的各大操作系统平台的功能,尤其是GUI控件,不愧是超大型一站式GUI超市,虽然网络组件不是很强大,但是应付一些基础应用还是绰绰有余的。在导出xml数据的时候,属性列表和值都按照xml的属性存储的而不是子节点,所以在解析的时候需要遍历节点的属性名称和属性值,QDomNamedNodeMap attrs = element.attributes();然后循环挨个取出名称和值即可,QDomNode n = attrs.item(i);QString nodeName = n.nodeName();QString nodeValue = n.nodeValue();
本控件也非原创控件,是参考网上的代码而来的,对称顾名思义就是将画布平均成上下两部分,将设置的值自动按照画布高度的一半作为参照高度进行绘制,然后增加动态过渡效果,有点类似于声音播放时候的频谱效果,一般都会用多个直方对称图组合成一个控件来实现多个效果,看起来会更美观,背景颜色可以设置成渐变的,柱状条的颜色也可以自行设置。
上一篇文章已经打通了数据源之一的串口采集,这次要说的是网络采集,网络通信目前用的最多的是三种,TCP/UDP/HTTP,其中tcp通信又包括了客户端服务端两种,tcp通信才用了多次握手机制不丢包,但是耗费资源多而且需要建立连接。udp通信在大数据量或者网络不稳定的情况下,可能丢包,而且顺序无法保证,但是一个包的数据肯定是正确的,由于占用资源极少而且不需要建立连接,在很多场景中应用也蛮多,我个人用udp以来,也没发现过丢包的情况,可能数据量不够大或者是在局域网内的原因吧,反正用起来还是蛮爽的。http通信目前非常流行,尤其是和服务器之间做数据交互,基本上post请求然后返回一串json数据,解析对应的json数据即可。本次采用的TCP通信作为示例,其他两种可以自行拓展,也很简单的。
开发需要,在 Linux下安装Qt Creator。我电脑装的是Ubuntu 16.04 LTS,其它的应该相同!
操作系统的更新迭代速度非常快,基本上三五年就有个新版本出来,WIN10操作系统还是一个比较成功的系统,据说现在市场份额越来越大,XP的份额已经很小,WIN7的份额也在逐步减少,在最新的WIN10系统中,右下角有个日历控件,还是自带农历的,这个本地化做的蛮好的,鼠标移上去还有光晕背景效果,体验非常赏心悦目,于是打算用Qt也高仿一个。
直方波形图控件非原创控件,控件大全中大概有20-30个控件非自己原创,而是参考了网上开源的代码,自己加以整理和完善,新增了插件的代码使得可以直接集成到QtDesigner或者QtCreator中。直方波形图,主要就是将外部传入的坐标集合数据进行渐变过渡的绘制,产生一个动态的过渡效果,将设置的坐标集合重新运算+1变成新的坐标集合来绘制,这样看起来绘制不会很死,而是缓慢的过渡。
数据库作为数据源,在很多组态软件中使用非常多,指定数据库类型,填写好数据库连接信息,指定对应的数据库表和字段,采集间隔,程序按照采集间隔自动采集数据库数据,绑定到界面上的控件赋值显示即可。使用数据库作为数据源,有个非常大的好处就是不用去写额外的通信代码,也与对方的什么语言什么平台无关,不会有扯皮的事情发生,例如通信协议不规范不准确导致解析不对的情况啊,这样就支持任意的语言和平台啦,毕竟有数据库这个中间载体过渡,而且任何语言任何平台都会有数据库,都兼容,所以采用数据库作为数据源不失为一种很好的方案,可以专注于软件功能的持续集成。
https://www.runoob.com/python/python-tutorial.html
有时,我们需要在嵌入式系统中实现GUI,来满足特定嵌入式场景的人机交互需求,比如汽车影音系统、智能医疗终端、可视化无人机遥控等。Qt是一套C++扩展库,为嵌入式和图形显示都做出了很多优秀的改进和提升。这一篇来看看把Qt搞到ARM平台开发板中的步骤和注意事项,以备不时之需。
对于 Qt 初学者而言,首先需要学习的就是 Qt 的基础模块 ( Qt Essentials )。
做嵌入式基本上用不到报表,但是桌面应用就经常会用到报表功能,在Qt下面可用的报表工具也挺多,需要根据具体的需求来选择,报表有的格式比较规矩,有的则比较特殊,所以要结合具体需求来选择合适的方案。
很多时候需要有一个控件,能够替代容器控件,自动容纳多个widget,自适应宽高,然后提供滚动条功能,这就必然需要用到QScrollArea控件,可设置各个子面板的间距等,也在很多系统中用到,比如温湿度设备面板,有几百个温湿度设备,需要一个容器放置,自动产生滚动条,可以设置面板的固定宽高或者自适应拉伸,其实就是放了表格布局+弹簧来设置。
领取专属 10元无门槛券
手把手带您无忧上云