热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

Qt开发经验小技巧216220

Qt的网络库支持udp广播搜索和组播搜索,其中组播搜索可以跨网段搜索,有时候你会发现失灵,此时你可以尝试把本地的虚拟机的网卡禁用试试,估计就好了。还有就是在本地开启了代理啥的,先关


  1. Qt的网络库支持udp广播搜索和组播搜索,其中组播搜索可以跨网段搜索,有时候你会发现失灵,此时你可以尝试把本地的虚拟机的网卡禁用试试,估计就好了。还有就是在本地开启了代理啥的,先关掉试试。近期在使用tcpsocket连接的时候,发现在Qt4和Qt5中正常的程序,到了Qt6中就不行了,报错提示 The proxy type is invalid for this operation ,原来是本地设置了代理导致的,可能在Qt6以前会默认跳过去不处理。

//也可以通过代码设置跳过代理
#include
QNetworkProxyFactory::setUseSystemConfiguration(false);
//下面这样每次设置也可以
tcpSocket->setProxy(QNetworkProxy::NoProxy);
//查阅到文章 https://www.cnblogs.com/cppskill/p/11730452.html
//从5.8开始socket默认代理类型是DefaultProxy而不是NoProxy,不知道出于什么考虑。


  1. 关于交叉编译,对于初学者来说是个极难跨过去的砍(一旦跨过去了,以后遇到需要交叉编译的时候都是顺水推舟、信手拈来。),因为需要搭建交叉编译环境,好在现在厂家提供的板子基本上都是测试好的环境,尤其是提供的编译器,不用自己再去折腾,按照官方手册来基本上不会有啥的的问题。



  • 在linux系统上编译ffmpeg和qt都是非常简单的事情,初学者也会,前提只要本地的gcc g++编译器正常。

  • 任何编译器包括嵌入式编译器,为了确保环境正常,你可以先查看对应的编译器版本是否ok,g++ -v arm-linux-g++ -v。

  • 交叉编译器查看版本 /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-g++ -v 。

  • 编译器位数和操作系统位数有关,一般32位的编译器要在32位的系统上做交叉编译,虽然32位也可以在安装依赖后,在64位系统做交叉编译,但是个人不建议,可能会出问题。64位的编译器只能在64位的系统。

  • 设置了环境变量则可以省略掉长长的路径,直接打可执行文件名称即可,没有设置环境变量则需要打完整路径。

  • 设置环境变量只是为了编译的时候让自动寻找编译器,其实也完全可以不用设置环境变量,使用绝对路径指定编译器位置即可。

  • 在linux上编译,无论是ffmpeg还是qt还是其他,都是通用的步骤,第一步:./configure 第二步:make 第三步:make install 。

  • 至于具体configure后面有哪些参数,参照对应源码包的手册就行,搜索也一大堆。当然你用默认的就不带任何参数一般也可以,自动采用默认参数进行编译。

  • 交叉编译ffmpeg命令:./configure --prefix=host --enable-static --disable-shared --disable-doc --cross-prefix=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux- --arch=arm --target-os=linux

  • 交叉编译qt前提:修改mkspecs/qws/linux-arm-g++下面的qmake.conf,如果没有设置环境变量则设置对应编译器的绝对路径,并将编译器的名字改成你需要的。

  • 比如修改gcc编译器:QMAKE_CC = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc

  • 交叉编译qt4.8.5命令:./configure -prefix host -embedded arm -xplatform qws/linux-arm-g++ -release -opensource -confirm-license -qt-sql-sqlite -qt-gfx-linuxfb -plugin-sql-sqlit -no-qt3support -no-phonon -no-svg -no-webkit -no-Javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -qt-zlib -no-gif -qt-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-rpath -no-pch -no-3dnow -no-avx -no-neon -no-openssl -no-nis -no-cups -no-dbus -little-endian -qt-freetype -no-opengl -no-glib -nomake demos -nomake examples -nomake docs -nomake tools

  • 交叉编译qt5.9.8命令:./configure -prefix host -xplatform linux-arm-g++ -recheck-all -opensource -confirm-license -optimized-qmake -release -no-separate-debug-info -strip -shared -static -c++std c++1z -no-sse2 -pch -compile-examples -gui -widgets -no-dbus -no-openssl -no-cups -no-opengl -linuxfb -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype

  • 综上所述交叉编译和常规的编译就一个区别,需要手动指定交叉编译器路径。ffmpeg是通过--cross-prefix=指定,qt比较庞大是通过更改配置文件最后通过-xplatform指定配置文件名称。

  • Qt6的编译比较繁琐,默认用cmake编译,在linux上先用cmake3.19以上版本的源码,用make编译生成cmake,然后再用cmake编译qt生成qmake,最后调用qmake来编译你的qt项目。

  • 编译Qt其实只是想用其中的库,至于demo、doc、tool、example等统统不用,费时费力。所以强烈建议编译的时候去掉,大大加快编译速度。

  • 编译建议用普通用户编译即可,包括解压源码,因为这样编译出来的库普通用户就能用,如果是root管理员编译的则以后都需要管理员权限才行。

  • 很多系统都提供了直接鼠标右键解压,其实也是可以的,就是速度慢,建议用命令行解压和删除目录。

  • Qt的编译参数每个版本都可能有出入,毕竟一直在更新代码,甚至有些分类描述变了,比如之前-qt-xcb到了5.15改成了-xcb,之前-qt-sql-sqlite改成了-qt-sqlite,一定要看源码下的readme,里面约定了编译环境要求的最低版本,后面qt5开始具体的配置参数有哪些放到了qtbase目录下的config说明。

  • 编译完成使用如果遇到提示 GL/gl.h 错误,需要安装 apt install libgl1-mesa-dev libglu1-mesa-dev 或者 yum install mesa-libGL-devel mesa-libGLU-devel 。

  • 编译参数说明可参考 https://blog.csdn.net/xi_gua_gua/article/details/53413930。



  1. 在Qt中设置图片有时候会发现不成功,很可能是因为文件的拓展名不正确导致的,比如jpg的图片拓展名是png,bmp的图片拓展名改成了jpg,QImage、QPixmap传入文件路径加载图片,是通过拓展名去调用对应的图片解析算法,比较傻,但是速度快,不用经过分析具体内部是何种图片格式。如果想要不管拓展名都能保证加载成功,则必须读取图片文件数据加载的方式处理。

//可以是资源文件中的图片也可以是本地文件
QString fileName = ":/test.png";
//此方式按照拓展名来区分具体格式不准确
//如果拓展名不正确就无法加载成功
ui->label->setPixmap(QPixmap(fileName));
//通过直接读取图片数据加载保证成功
QFile file(fileName);
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
//通过 QImage 处理
QImage img;
img.loadFromData(data);
//下面这种方式也行
//QImage img = QImage::fromData(data);
ui->label->setPixmap(QPixmap::fromImage(img));
//通过 QPixmap 处理
QPixmap pix;
pix.loadFromData(data);
ui->label->setPixmap(pix);


  1. 总结几个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数据库插件的版本,往后的版本需要自行编译对应的mysql数据库插件,官方安装包不再提供。

  • Qt5.12.5是最后样式表性能最高的版本,经过酷码大佬查阅代码发现此后版本的样式表源码中为了修复一个bug做了循环嵌套设置,导致性能急剧下降,界面越多性能暴降10倍以上。

  • Qt5.14.2是最后提供二进制安装包的版本,后面的版本都需要在线安装。

  • Qt5.15系列是最后支持win7的版本,后面的Qt6系列版本需要更改源码编译才能支持win7,这对于小白来说难于上青天。

  • Qt6.0/6.1版本其实也是支持win7的,但是因为缺失太多模块,而且BUG成山,大佬说了狗都不用,所以使用此版本没意义。

  • Qt6不支持win7,是说开发阶段和运行阶段都不支持,无论开发阶段还是运行阶段你都需要Qt的库,只要是Qt的库不支持,到哪里也不支持。

  • 新版的qtc7由于采用Qt6编译,所以也只能在win10及以上运行,意味着你要用新的qtc7+Qt5做开发也必须用win10及以上。

  • 欢迎各位补充,比如哪个版本以后商用需要收费之类的,貌似用Qt4,在不更改Qt本身源码,动态库发布程序,法律风险小一些?



  1. Qt官方除了Qt库一直在升级外,对应的集成开发环境也在更新升级,一般会选用最新的Qt库编译新版本,要注意的是,有些人安装的旧版本的qtc,加载比较高版本的Qt库,很容易出现报错提示 Project ERROR: Cannot run compiler 'g++'. Maybe you forgot to setup the environment? 之类的,一般是版本跨度过大,比如用Qt5.5附带的qtc加载Qt5.9的库,导致有些环境识别不到,可能是qtc在新版本中对某些识别处理规则有变动。所以一般建议可以用新的qtc加载旧的Qt库,不建议旧的qtc加载新的Qt库。



推荐阅读
  • 本文介绍了一种简单的方法,帮助Windows 7用户将默认浏览器从Opera更换为其他浏览器。无论您偏好使用哪种浏览器,都可以轻松实现更换。 ... [详细]
  • 本文总结了在多人协作开发环境中使用 Git 时常见的问题及其解决方案,包括错误合并分支的处理、使用 SourceTree 查找问题提交、Git 自动生成的提交信息解释、删除远程仓库文件夹而不删除本地文件的方法、合并冲突时的注意事项以及如何将多个提交合并为一个。 ... [详细]
  • Lua字符串1.字符串常见形式字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua语言中字符串可以使用以下三种方式来表示:•单引号间的一串字符。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 如何在WebStorm官网下载历史版本
    本文详细介绍了如何在WebStorm官方网站上查找并下载历史版本,包括搜索WebStorm、选择下载选项、浏览不同版本等步骤。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 宝塔面板下启用HTTPS的详细指南
    本文提供了在宝塔面板环境中配置HTTPS的具体步骤,确保您的网站通信更加安全可靠。 ... [详细]
  • 正则表达式入门指南
    本文基于《正则表达式必知必会》(作者:Ben Forta,译者:杨涛),介绍了正则表达式的基本概念及其应用,包括搜索与替换功能,以及元字符的分类与使用。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 初探Hadoop:第一章概览
    本文深入探讨了《Hadoop》第一章的内容,重点介绍了Hadoop的基本概念及其如何解决大数据处理中的关键挑战。 ... [详细]
  • Day4今天继续复习搞基础课,加油!树形DP每一个节点都分为选和不选两种状态,选为f[i,1],不选为f[i,0]&# ... [详细]
  • 最优化算法与matlab应用3:最速下降法
    最优化算法与matlab应用3:最速下降法最速下降法是一种沿着N维目标函数的负梯度方向搜索最小值的方法。(1)算法原理函数的负梯度表示如下:搜索步长可调整ak,通常记为(第k次迭代 ... [详细]
  • 近期阅读了《中国云计算的十年变迁》和《阿里云背后的创新者们》两篇文章,深入了解了中国云计算的十年发展历程及阿里云的创立背景。阿里云作为中国公有云市场的先驱,其未来的竞争格局引人关注。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
author-avatar
惯性hold不住
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有