![](https://img-blog.csdnimg.cn/direct/c569c8b5575941598656cc94f2601979.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Qt/C++经验和类库
文章平均质量分 77
分享一些平时Qt实战过程中的小技巧,以及这十几年经验中常用的封装的一些方法和类库。公众号:Qt实战/Qt入门和进阶
feiyangqingyun
欢迎关注公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)
展开
-
Qt/C++开发经验小技巧296-300
现在现在新版的Qt都是需要在线下载,有时候下载到中途过程会遇到提示下载错误,很可能是部分插件模块对应服务器没有打包导致的,一般都是一些末尾带TP字样的模块,这些模块一般也不会用,所以如果想要安装成功,你需要到选择Qt版本和插件的地方,打开Additional Libraries节点,将那些用不上的尤其是TP结尾的都不勾选,再安装即可。原创 2024-07-02 12:39:20 · 715 阅读 · 0 评论 -
Qt血的教训/细数Qt开发的各种坑/又爱又恨/欢迎围观留言评论
搞Qt开发十几年了,最初从Qt4.6开始,一直追新到现在的6.7版本,中间经历过无数的血的教训,简直是又爱又恨。其实Qt挺好的,但是还是要忍不住吐槽一下,本人还是希望Qt发展的越来越好,这样我的饭碗就能保住了。原创 2024-04-07 10:30:46 · 1519 阅读 · 1 评论 -
Qt程序员必看/关于Qt收费的官方答复
5.订阅模式购买的商业版本,后续没有继续购买,是否影响后续商业产品的的销售和软件开源协议的变化?2.Qt5和Qt6额外提供了哪些开源版本没有提供的模块?3.商业版本的Qt是否提供最新版本的离线安装包?4.商业授权版本具体报价?原创 2024-04-02 08:17:18 · 2576 阅读 · 3 评论 -
qt+ffmpeg开发经验技巧
ffmpeg的库有链接顺序要求,如果不按照顺序来,也许在windows上没有问题,但是到了unix系统很可能有问题,报错提示云里雾里的找不到原因。顺序参照ffmpeg自带示例中的编译链接顺序即可。正确顺序是 LIBS += -L/ -lavformat -lavfilter -lavcodec -lswresample -lswscale -lavutil -lavdevice 。不是所有的库都是必须的,比如avdevice库,如果代码中没用上也没引用,可以不需要。ffmpeg解码中,av_find_b原创 2024-03-20 14:10:56 · 1077 阅读 · 0 评论 -
Qt/C++开发经验小技巧291-295
【代码】Qt/C++开发经验小技巧291-295。原创 2023-12-19 11:44:34 · 1094 阅读 · 0 评论 -
Qt/C++开发经验小技巧286-290
很多时候项目越写越大,然后就可能遇到,明明之前很简单的一段代码,运行的好好的,就那么几行几十行,为何一旦加入到当前项目中,就不行了,百思不得其解。在QTreeWidget/QTableWidget的信号currentItemChanged中,执行对应的clear方法也会触发该信号,这就需要特别注意了,对应该信号的两个参数 current/previous 表示当前节点和上一个节点,两个参数的值都为空,所以在该信号对应槽参数处理中,必须先判断该值是否为空指针,不判断的话很可能导致程序崩溃。原创 2023-11-09 16:59:58 · 1085 阅读 · 0 评论 -
Qt/C++开发经验小技巧281-285
Qt中的布局有个默认的margin边距值和spacing间距值,在没有设置该值的情况下,会根据运行的环境自动设置该值,比如1080P分辨率和2k分辨率的电脑,该值的默认值不一样,并不是你在UI设计的时候属性栏中看到的值,这个要特别注意,你看到的7可能在目标平台运行的时候是11,如果一定要按照你想要的值来运行,可以重新设置即可,设置过哪一个就该值按照设定的来。该方式也是属于斗皇级别的UI外观控制策略,最终所有的qss样式也是要通过该样式去绘制的,意味着这里你可以重新定义和控制所有控件的外观样式,非常的强大。原创 2023-08-23 11:52:15 · 931 阅读 · 0 评论 -
Qt安卓开发经验技巧总结V202308
改好以后,设置sdk保存目录,单击右侧的 Set Up SDK 按钮,自动下载一堆文件,最后下面有个openssl的目录文件也设置下。第二个难点就是用java写对应的类,如果是会安卓开发的人来说那不要太简单,尤其是搜索那么方便一大堆,没有搞过安卓开发的人来说就需要学习下,这个没有捷径,只是希望Qt能够尽可能最大化的封装一些可以直接使用的类,比如后期版本就提供了权限申请的类 QtAndroid::requestPermissionsSync 之类的,用起来就非常的爽,不用自己写个java类调来调去的。原创 2023-08-20 11:45:13 · 1547 阅读 · 0 评论 -
Qt4/5升级到Qt6吐血经验总结V202308
增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废弃了,必须用Qt5中对应的新的函数。跟随时代脚步,增加了不少新特性以满足日益增长的客户需求。对某些模块和类型及处理进行了革命性的重写,运行效率提高不少。有参数类型的变化,比如 long * 到 qintptr * 等,更加适应后续的拓展以及同时对32 64位不同系统的兼容。原创 2023-08-14 10:39:02 · 1223 阅读 · 1 评论 -
Qt/C++开发经验小技巧276-280
无效,哪怕是指定颜色 QMdiArea{background:#ff0000;} 都不行,这就很无语了,原来要用弱属性机制才行。当样式中启用了禁用样式 *:disabled{xxx} 的时候,会发现MDI子窗体无法拉伸了,这应该是Qt内部的BUG,怎么解决呢,只需要重新设置MDI这个类别的禁用样式的边框样式即可。用QProcess执行命令或者启动可执行文件,默认写法不支持带空格的路径,比如 Program Files ,需要在这个路径前后加上双引号才行,估计可能内部会用空格分割字符串导致解析失败。原创 2023-06-30 11:38:15 · 1025 阅读 · 0 评论 -
Qt/C++开发经验小技巧271-275
前面执行一些处理,比如 QApplication::setAttribute 就必须在最前面执行,而很多时候这个设置的参数不能改写死,毕竟现场的环境千差万别,希望通过配置文件来配置,那么问题来了,读取配置文件一般需要指定路径才能正常读取到,如果是 ./ 这种,很可能未必是应用程序的当前路径,如果你是双击运行的程序,那肯定是应用程序的当前路径,不是双击运行那就是系统环境中的当前路径,意味着你开机启动或者用system、QProcess等方式在开机后调用启动的话,就未必正确了。原创 2023-06-20 08:23:09 · 1016 阅读 · 0 评论 -
Qt/C++开发经验小技巧266-270
下拉框控件QComboBox默认会根据item的字符宽度调整下拉框的宽度,比如其中某个item文本很长,则下拉框会变的很宽,甚至把整个界面撑大看起来变形的感觉,有时候我们不希望是这样,有多个方法可以去掉,方法一就是设置下拉框的拉伸策略为QSizePolicy::Ignored,然后将下拉框放到一个容器中,保证容器布局中的其他控件都是有固定尺寸或者fix填充尺寸,这样下拉框就是默认自动拉伸的而且保证不会跟着item的宽度变宽。即可,整个项目中所有下拉框都会自动应用这个策略。原创 2023-05-22 09:05:40 · 956 阅读 · 0 评论 -
Qt/C++开发经验小技巧261-265
代码中判断当前Qt库是32位还是64位,用QSysInfo::WordSize=32/64。QTreeView控件设置左侧branch图标大小,无法通过qss设置,万能大法查看源码得知控制宽度最后取决于indentation参数,indentation的默认值根据系统环境不同而不同,比如1080P分辨率下是20,你要放大可以通过 setIndentation(30) 来设置。在对选项卡控件QTabWidget设置样式表的时候,很多人希望能做成类似浏览器或者资源管理器中上面选项卡的样子,就是选中的tab上边左原创 2023-03-30 08:44:36 · 1049 阅读 · 0 评论 -
Qt/C++开发经验小技巧256-260
在有些没有opengl环境的Qt开发中,比如一些嵌入式板子为了节省资源没有编译opengl所以不会有opengl相关的头文件,在编译项目过程中可能遇到提示 GLES3/gl3.h: No such file or directory,尽管你的项目中也没有用到opengl的任何东西,那是因为你包含了一个大模块 #include ,而这个大模块中包含了 #include “qopenglwidget.h” ,你需要做的是在引入大模块前面加一行。可以通过设置过滤机制,将代码中的部分打印类别屏蔽掉,比如只原创 2022-12-14 11:03:58 · 1504 阅读 · 1 评论 -
Qt/C++开发经验小技巧251-255
Qt中的事件过滤器相当于万能大法(终极秘密武器),尤其是对整个应用程序安装事件过滤器,则可以拿到所有的事件。比如可以拿到系统标题栏鼠标按下松开,对所有需要移动的无边框窗体统一拦截进行移动处理。个人建议不到万不得已不建议使用,有一定性能损耗,毕竟这个是从最初源头拦截事件,意味着所有的事件都会到这里过一遍。如果你在收到对应事件后还做了一定耗时的处理,很容易就卡主了UI主线程。有时候我们发现控件设置透明后背景变成黑色,你可以尝试设置透明度值1而不是完全透明0,这样看起来是透明的但是又保留了窗体的特性。原创 2022-10-09 09:31:34 · 1276 阅读 · 0 评论 -
Qt/C++开发经验小技巧246-250
关于如何快速结束线程,调用terminate暴力结束容易出问题。一般来说我们都是采用标志位来结束线程,但是如果执行过程中的函数很耗时,或者在run中msleep休息的时间过久,容易导致要很长一段时间才能正确停止,此时可以考虑一个策略就是分割线程执行体,如果是函数体耗时可以在耗时的函数体中增加停止标志位的判断,使其快速跳出;其实用set get这样处理主要还是为了拓展性,比如后期如果需要对赋值进行过滤处理,或者该变量只允许读写中的一个,如果之前是直接使用的变量外,则使用的地方都要去修改规则,反而变得很糟糕。原创 2022-09-14 18:41:02 · 2526 阅读 · 0 评论 -
Qt/C++开发经验小技巧241-245
Qt开发经验小技巧236-240。原创 2022-08-31 09:02:42 · 1355 阅读 · 0 评论 -
Qt开发经验小技巧236-240
关于在头文件中定义函数使用static关键字的血的教训。原创 2022-08-14 11:18:15 · 2123 阅读 · 0 评论 -
Qt/C++开发经验小技巧231-235
Qt开发经验小技巧231-235原创 2022-08-05 15:34:46 · 1752 阅读 · 0 评论 -
Qt/C++开发经验小技巧226-230
Qt开发经验技巧原创 2022-06-30 20:12:58 · 2429 阅读 · 2 评论 -
关于Qt/C++数据库开发的一些冷知识
Qt支持不指定数据库名打开数据库,因为有时候是要在连接数据库服务器后,执行sql语句创建数据库。数据库都还没存在怎么连接呢,测试发现sqlite、mysql、sqlserver、postgresql都支持这个特性。在删除和创建数据库的前提是该数据库没有被其他程序占用,比如其他程序已经打开了该数据库则会执行失败。这里我就折磨过很多次,为什么执行失败呢?后面发现第三方数据库工具已经打开了该数据库,把工具关掉就ok了。用QSqlQueryModel+QTableView显示数据,int类型的数据,如果超过原创 2022-06-26 17:25:14 · 2368 阅读 · 5 评论 -
Qt/C++编译数据库插件通用步骤说明
近期特意花了点时间,在之前数据库集成应用这个组件的基础上再次迭代完善,历经九九八十一难,将Qt的各种数据库插件,十几个Qt版本,全部编译一遍,同时打通了插件形式直连数据库和ODBC数据源连接方式,做过各种对比测试,不同数据库不同分页算法,不同日期时间范围判断查询等。安装对应的数据库,安装后会有include头文件和lib链接库文件,这是基本的前提,编译数据库插件必须要有这两个东西。务必注意,32位的Qt必须安装32位的数据库才能正常编译成功,位数要一致。准备好数据库插件源码,比如qt-everywhere-原创 2022-06-24 09:20:51 · 1497 阅读 · 1 评论 -
Qt/C++开发经验小技巧221-225
在读取文本文件的时候,有时候会发现读取出来的中文乱码,这个时候就需要识别文件编码格式,然后主动设置对应的编码去读取就不会乱码。在连接远程数据库进行查询数据的时候,有时候会发现很慢,尤其是表数据量越多越慢,本地的话同等数据量快很多,可以尝试开启只前进属性,query.setForwardOnly(true);这样的话只会缓存一次的数据,大大提高远程数据库的查询效率,据说可以提高几十倍百倍的速度。当然前提是对查询的数据之前向前取数据的需求,如果还要往后取数据或者在数据模型QSqlQueryModel中原创 2022-06-13 09:18:46 · 1435 阅读 · 0 评论 -
关于QCustomPlot超级图表的一些冷知识点
开源的图表控件QCustomPlot很经典,作者至少是八星斗圣级别,在曲线数据展示这块性能彪悍,总结了一些容易忽略的经验要点。可以将XY轴对调,然后形成横向的效果,无论是曲线图还是柱状图,分组图、堆积图等,都支持这个特性。不需要的提示图例可以调用 legend->removeItem 进行移除。两条曲线可以调用 setChannelFillGraph 设置合并为一个面积区域。可以关闭抗锯齿 setAntialiased 加快绘制速度。可以设置不同的线条样式(setLineStyle)、数据原创 2022-05-29 09:45:16 · 2194 阅读 · 3 评论 -
Qt/C++开发经验小技巧216-220
Qt的网络库支持udp广播搜索和组播搜索,其中组播搜索可以跨网段搜索,有时候你会发现失灵,此时你可以尝试把本地的虚拟机的网卡禁用试试,估计就好了。还有就是在本地开启了代理啥的,先关掉试试。近期在使用tcpsocket连接的时候,发现在Qt4和Qt5中正常的程序,到了Qt6中就不行了,报错提示 The proxy type is invalid for this operation ,原来是本地设置了代理导致的,可能在Qt6以前会默认跳过去不处理。//也可以通过代码设置跳过代理#include <.原创 2022-05-21 09:25:04 · 1397 阅读 · 1 评论 -
关于Qt高分屏缩放几个知识点
在windows上经常遇到高分屏缩放的问题,很头疼,貌似这东西就是windows首发的。在Qt4时代的程序遇到高分屏缩放,不作任何处理,毕竟Qt4时代(2010年以前)出来的时候几乎还没高分屏缩放这东西。从Qt5.6开始提供了高分屏缩放支持,需要在main函数前面设置 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);从Qt5.14开始提供了高分屏缩放策略设置,需要在main函数前面设置 QApplication::setHighDpiS.原创 2022-05-19 12:46:39 · 4147 阅读 · 0 评论 -
总结几个Qt版本的冷知识
Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的(很多嵌入式板子还是用Qt4.8),其实该版本是和Qt5.5差不多时间发布的。参考链接 https://www.qt.io/blog/2015/05/26/qt-4-8-7-released https://blog.qt.io/blog/2015/07/01/qt-5-5-released/Qt5.6.3最最后支持xp系统的长期支持版本,Qt5.7.0是最后支持xp系统的非长期支持版本。Qt5.12.3是最后提供mysql数据库插件的.原创 2022-05-12 17:22:02 · 2948 阅读 · 1 评论 -
Qt/C++交叉编译整理的几点说明
关于交叉编译,对于初学者来说是个极难跨过去的砍(一旦跨过去了,以后遇到需要交叉编译的时候都是顺水推舟、信手拈来。),因为需要搭建交叉编译环境,好在现在厂家提供的板子基本上都是测试好的环境,尤其是提供的编译器,不用自己再去折腾,按照官方手册来基本上不会有啥的的问题。在linux系统上编译ffmpeg和qt都是非常简单的事情,初学者也会,前提只要本地的gcc g++编译器正常。任何编译器包括嵌入式编译器,为了确保环境正常,你可以先查看对应的编译器版本是否ok,g++ -v arm-linux-g++ -原创 2022-05-07 14:38:36 · 2058 阅读 · 0 评论 -
Qt/C++开发经验小技巧211-215
QMainWindow 在对停靠窗体进行排列的时候,有些不常用的设置容易遗忘,建议将 QMainWindow 的头文件函数过一遍一目了然。//设置停靠参数,不允许重叠,只允许拖动this->setDockOptions(QMainWindow::AnimatedDocks);//将底部左侧作为左侧区域,底部右侧作为右侧区域,否则底部区域会填充拉伸this->setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);this-&.原创 2022-04-29 13:37:36 · 2385 阅读 · 0 评论 -
Qt/C++开发经验小技巧206-210
有时候需要对文本进行分散对齐显示,相当于无论文字多少,尽可能占满整个空间平摊占位宽度,但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Qt::AlignVCenter) 设置分散对齐会发现没有任何效果,这个时候就要考虑另外的方式比如通过控制字体的间距来实现分散对齐效果。QString text = "测试分散对齐内容";//计算当前文本在当前字体下占用的宽度QFont font = ui->label->font();i.原创 2022-04-14 13:25:42 · 1546 阅读 · 0 评论 -
Qt/C++设置运行时动态库路径的几点说明
随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下文件数量真多(比如著名的金融软件 https://www.webull.com/ 哎呀我去,目录下一堆动态库文件,滚动条都要拉很久,全部堆一块),此时可能会考虑如何将一些库文件分门别类的存放,这样方便管理。Qt提供的设置动态库路径的方法setLibraryPaths是用来搜索插件动态库的,而不是程序直接依赖的动态库。很多人以为这个可以设置Qt的库或者程序中依赖的第三方库的路径,其实想想也知道,因为原创 2022-04-12 15:21:34 · 4495 阅读 · 3 评论 -
Qt/C++安卓开发经验021-030
关于权限设置,在早期的安卓版本,所有权限都写在全局配置文件AndroidManifest.xml中,这种叫安装时权限,就是安装的时候告诉安卓系统当前app需要哪些权限。大概从安卓6开始,部分权限需要动态申请,这种叫动态权限,这种申请到的权限也可以动态撤销,就是要求程序再次执行代码去向系统申请权限,比如拍照、存储读写等。也不是所有的权限都改成了动态申请,意味着兼容安卓6以上的系统你既要在AndroidManifest.xml中写上要求的权限,也要通过checkPermission申请你需要的权限。a..原创 2022-04-11 09:13:28 · 1437 阅读 · 1 评论 -
Qt/C++安卓开发经验011-020
安卓中一个界面窗体对应一个Activity,多个界面就有多个Activity,而在Qt安卓程序中,Qt这边只有一个Activity那就是QtActivity(包名全路径 org.qtproject.qt5.android.bindings.QtActivity),这个QtActivity是固定的写好的,整个Qt程序都是在这个QtActivity界面中。你打开AndroidManifest.xml文件可以看到对应节点有个name=org.qtproject.qt5.android.bindings.QtA..原创 2022-04-07 14:39:23 · 3828 阅读 · 1 评论 -
Qt/C++安卓开发经验001-010
pro中引入安卓拓展模块 QT += androidextras 。pro中指定安卓打包目录 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android 指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。AndroidManifest.xml 每个程序唯一的一个全局配置文件,里面xml格式的数据,标明支持的安卓版本、图标位置、横屏竖屏、权限等。这个文件是最关键的,如果没有这个文件则Qt会默认生成一个。android/res/drawable.原创 2022-04-06 09:08:29 · 1680 阅读 · 1 评论 -
Qt/C++开发经验小技巧201-205
编译生成debug版本动态库,文件末尾自动加上d结尾。CONFIG(debug, debug|release) { win32: TARGET = $$join(TARGET,,,d) mac: TARGET = $$join(TARGET,,,_debug) unix:!mac: TARGET = $$join(TARGET,,,d)}QtCreator中pro项目文件格式说明。名称说明QT += core gui添.原创 2022-04-01 08:51:05 · 2450 阅读 · 0 评论 -
Qt/C++开发经验小技巧196-200
关于Qt延时的几种方法。void QUIHelperCore::sleep(int msec){ if (msec <= 0) { return; }#if 1 //非阻塞方式延时,现在很多人推荐的方法 QEventLoop loop; QTimer::singleShot(msec, &loop, SLOT(quit())); loop.exec();#else#if (QT_VERSION >= QT_V.原创 2022-03-08 08:38:53 · 1968 阅读 · 3 评论 -
Qt/C++项目升级到Qt6经验总结
1 直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废弃了,必须用Qt5中对应的新的函数。跟随时代脚步,增加了不少新特性以满足日益增长的客户需求。对某些模块和类型及处理进行了革命性的重写,运行效率提高不少。有参数类型的变化,比如 long * 到 qintptr * 等,更加适应后续的拓展以及同时对32 64位不同系统的兼容。源码中的double数据原创 2022-03-06 11:11:01 · 4222 阅读 · 4 评论 -
Qt/C++开发经验小技巧191-195
关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数prepend、push_front。QStringList list;list << "aaa" << "bbb" << "ccc";//往后追加 等价于 appendlist.push_back("ddd");//往前追加 等价于 prependlist.p.原创 2021-12-30 10:38:53 · 3669 阅读 · 2 评论 -
Qt/C++开发经验小技巧186-190
关于是使用QList还是QVector的问题,一直是众多Qter的选择问题,主要是这两个玩意提供的的接口函数基本一致,比如插入、删除、取值等。大多数情况下可以用QList。像append、prepend、insert这种操作,通常QList比QVector快的多。QList是基于index标签存储它的元素项在内存中,比那种依赖iterator迭代的更快捷,而且你的代码也更少。如果你需要一个真正的连接着的list,且需要保证一个固定插入耗时。那就用迭代器,而不是标签。使用QLinkedList().原创 2021-11-30 09:25:17 · 7432 阅读 · 3 评论 -
Qt/C++开发经验小技巧181-185
Qt天生就是linux的,从linux开始发展起来的,所以不少Qt程序员经常的开发环境是linux,比如常用的ubuntu等系统,整理了一点常用的linux命令。命令功能sudo -s切换到管理员,如果是 sudo -i 切换后会改变当前目录。apt install g++安装软件包(要管理员权限),另一个派系的是 yum installcd /home进入home目录ls罗列当前所在目录所有目录和文件ifconfig查看网卡信息包括IP地址,wi.原创 2021-10-30 19:31:18 · 2163 阅读 · 0 评论