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

Qt开发经验小技巧216-220的更多相关文章

  1. Qt开发经验小技巧81-90

    Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...

  2. Qt开发经验小技巧61-70

    很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...

  3. Qt开发经验小技巧41-50

    如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...

  4. Qt开发经验小技巧71-80

    在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...

  5. Qt开发经验小技巧51-60

    在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...

  6. Qt开发经验小技巧31-40

    代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...

  7. Qt开发经验小技巧21-30

    如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...

  8. Qt开发经验小技巧11-20

    获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...

  9. Qt开发经验小技巧1-10

    当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...

  10. Qt开发经验小技巧合集

    一.开发经验总结 当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它, ...

随机推荐

  1. NVM使用说明

    下载:https://github.com/coreybutler/nvm-windows/releases 切换镜像源:  settting.txt文件后面添加 node_mirror: https ...

  2. 谈一谈 vuex 里边,actions,mutations ,state 之间的运转方式

    首先,调用 actions 中的方法,一般我们在 actions 做登录和登出的请求 : 然后调用 mutations 的方法修改数据 ,因为 mutations 方法是修改state的数据的唯一方法 ...

  3. NebulaGraph 的云产品交付实践

    作者:乔雷,Vesoft.Inc 云原生技术专家 NebulaGraph 介绍 NebulaGraph 是由杭州悦数科技有限公司自主研发的一款开源分布式图数据库产品,擅长处理千亿节点万亿条边的超大数据 ...

  4. PostgreSQL 17重磅登场——世界上最成功的数据库

    朋友们,万众期待的 PostgreSQL 大版本发布又来了!这一次,PostgreSQL 17 带着全新的性能优化和开发者必备的新功能强势登场.与其说这是一场普通的更新,不如说它是一场专为高并发工作负 ...

  5. Oracle 11.2.0.4 Data Guard 部署练习【一主一备/单机】

    Oracle DG 理论及实验笔记 DATAGUARD 是通过建立一个 PRIMARY 和 STANDBY 组来确立其参照关系. STANDBY 一旦创建, DATAGUARD 就会通过将主数据库 ( ...

  6. vue axios的使用及操作

    引入axios  并设置原型 Vue.prototype.$axios = axios;   在其他地方就可以this.$axios使用了   let param = _this.$qs.string ...

  7. spool参数详解

    SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等.可用SET命令改变这些系统变量,也可 ...

  8. Go语言GOPATH是什么

    一.GOPATH的概念 GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区). 工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码, ...

  9. 3.1 Linux文件系统的层次结构

    通过学习<Linux一切皆文件>一节我们知道,平时打交道的都是文件,那么,应该如何找到它们呢?很简单,在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点"/&qu ...

  10. Android Hybird架构之整合XwalkView,让你的App内置chromium内核

    使用XwalkView的目的无非是为了提升Android4.4以下版本(非chromium内核)的Html5渲染性能,并且能够使得H5页面在众多定制化的ROM上拥有一致的体验. 当然了,App内置Ch ...