Qt/C++开发经验小技巧306-310
远程过很多人电脑远程分析问题,发现一个通病,比如明明修改了某个数据库或者配置文件,结果运行程序一看,还是旧的数据,死活都不行,查了半天程序,始终找不到问题所在。最终查到原来是程序读取的文件根本不是修改过的文件,因为用户电脑环境中有好几份同样的代码目录,他打开的目录是另外一份,无论怎么修改,其实都是和当前程序无关的,根本没有改对地方。大数据统计,这种情况还真不少,至少占五分之一的比例。有好几份拷贝的情况很多时候避免不了,比如为了临时备份代码,以便测试新的代码。但是务必记得当前项目做过拷贝,遇到问题的时候先检查目录是否正确,是否是当前打开的项目代码所在目录。
在使用第三库的过程中,当你使用的库种类越多,会发现一个现象,有些库依赖编译器的,比如opencv,如果你用msvc编译出来的库,那你的程序只能用msvc的套件才能正常链接该库,你要是用mingw去链接肯定失败的,要想用mingw也能成功链接,你只能用mingw去编译opencv。到这里你是不是以为都是这个规则?那就错了,当你用ffmpeg的库的时候,就不存在这个问题,官方下载的库文件,既能用msvc也能用mingw去链接。这是因为ffmpeg是纯c项目,而opencv是纯c++项目,涉及到ABI的问题,这是C++的特性导致的。C++是一种复杂的编程语言,支持继承和多态,因此编译器要想保证准确调用函数,就需要确定其调用约定(函数名区分、参数输入、栈管理等)、返回类型及参数列表。在同一种架构下不同编译器对此导出的规则不一致。所以总结就是,纯c的项目编译出来的库不用区分编译器,纯c++的需要区分。qtav作者有个最新力作mdk项目,也是纯c写的,提供了mingw和msvc的库,无论何种编译器编译出来的库,都同时兼容msvc和mingw编译器,这就是纯c的魅力。
有时候我们需要写入文件到磁盘,但是有些情况下,如果对应目录不存在则写入失败,需要先判断目录是否存在,不存在则新建,QDir提供了mkdir和mkpath两种方法来创建目录,以前以为这两个是一样的功能,类似于size和length,其实不是的,直到近期才发现了区别。mkdir只会创建路径中的最末尾的目录,如果父目录不存在,则创建失败。而mkpath会逐级判断整个路径的目录,父目录不存在则创建父目录,依次下去,保证指定的路径创建成功,建议使用mkpath。
QDir dir;
//如果path目录不存在则dir目录也会创建失败
dir.mkdir("f:/path/dir");
//会先创建path目录然后创建dir目录
dir.mkpath("f:/path/dir");
当你在widget项目中将js文件添加到资源文件中,编译的时候很可能出现 qmlcache_loader.o:qmlcache_loader.cpp:(.text+0x32) 错误,这是因为qtc默认会开启qtquickcompiler,以便通过预处理资源中的所有js文件,加快文件加载到Qml引擎的速度,但是有些时候我们并不是用它加载到qml运行,可能是放在QtWebEngine中用于交互,或者widget中执行js函数拿到结果。可以在qtc的项目配置中找到qt quick compiler选项,下拉框选择禁用。也可以在pro中加一行 CONFIG -= qtquickcompiler 即可。这个确切的说是qt的bug,在5.15.2以及后续版本不存在。
新版的QtCreator默认的编译目录路径在源码下build目录,之前是在源码同级的build-xxx目录,个人还是喜欢之前的方式,所有编译生成的临时文件在源码外单独的一个目录,不需要的时候直接删除就好,源码目录永远干干净净的。当然qtc也是提供了设置目录的地方,在首选项-》构建和运行-》Default Build Properties 里面第一行,将之前的 ./build/%{Asciify:%{Kit:FileSystemName}-%{BuildConfig:Name}} 改成 ../build-%{Project:Name}-%{Kit:FileSystemName}-%{BuildConfig:Name} 即可。
Qt/C++开发经验小技巧306-310的更多相关文章
- Qt开发经验小技巧81-90
Qt中的QColor对颜色封装的很完美,支持各种转换,比如rgb.hsb.cmy.hsl,对应的是toRgb.toHsv.toCmyk.toHsl,还支持透明度设置,颜色值还能转成16进制格式显示. ...
- Qt开发经验小技巧61-70
很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...
- Qt开发经验小技巧41-50
如果使用sqlite数据库不想产生数据库文件,可以创建内存数据库. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ...
- Qt开发经验小技巧71-80
在我们使用QList.QStringList.QByteArray等链表或者数组的过程中,如果只需要取值,而不是赋值,强烈建议使用 at() 取值而不是 [] 操作符,在官方书籍<C++ GUI ...
- Qt开发经验小技巧51-60
在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...
- Qt开发经验小技巧31-40
代码判断MSVC编译器版本. if (_MSC_VER == 1800) MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) MSVC++ 12.0 _ ...
- Qt开发经验小技巧21-30
如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...
- Qt开发经验小技巧11-20
获取类的属性 const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyC ...
- Qt开发经验小技巧1-10
当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了. 定时器是个好东西,学会好使用它,有时候用QTime ...
- Qt开发之Hello Qt及学习小技巧
创建第一个Qt程序的简单流程 如果安装了andriod或ios的版本也会显示出来,这里只显示了桌面端的 一个项目文件代码结构如下: 如下图可直接编辑label里的文字内容: 运行结果:(快捷键ctrl ...
随机推荐
- js模拟二维数组求和
JavaScri实际上没有二维数组的概念,但是由于js变量是松散的,所以能设置数组元素为数组来模拟二维数组,以此类推,可以模拟多维数组. /* 需求:模拟了3 * 3数组求右上三角元素之和1 + 3 ...
- 《使用Gin框架构建分布式应用》阅读笔记:p52-p76
<用Gin框架构建分布式应用>学习第4天,p32-p76总结,总计25页. 一.技术总结 1.Go知识点 (1)iouti 书上使用ioutil包读取JSON文件,但是从go 1.16 开 ...
- Kubernetes CNI 插件选型和应用场景探讨
作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes.KubeSphere.KubeKey 等. 本文介绍容器环境常见网络应用场景及对应场景的 ...
- 一些新奇的玩意【php篇--持续更新】
人不进步就等于退步! 接触越多的人以及事就能学到更多的东西. 以下仅为本人记录的一些新奇的东西,不喜勿喷! 1.??运算符号,在新的项目中突然发现很多红线报错,还以为是错误!看了下,是??运算的问题, ...
- 自学PHP笔记(二) PHP数据类型
本文转发来自:https://blog.csdn.net/KH_FC/article/details/115415323 PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 bool ...
- C#多线程编程:AutoResetEvent
作用 简单的完成多线程同步,两个线程共享相同的AutoResetEvent对象.线程可以通过调用AutoResetEvent对象的WaitOne()方法进入等待状态当第二个线程调用Set()方法时,它 ...
- three.js+vue智慧社区web3d数字孪生三维地图
案例效果截图如下: 具体案例场景和功能,详见b站视频: https://www.bilibili.com/video/BV1Bb421E7WL/?vd_source=7d4ec9c9275b9c7d1 ...
- NOIP2015 提高组 子串
NOIP2015 提高组 子串 感觉是最长公共子序列模型的变式. 容易想到记 \(f[i][j][k]\) 表示 \(A\) 走到了第 \(i\) 位,\(B\) 匹配上了 \(1 \sim j\), ...
- PXI板卡的封装和接口形式
PXI模块 PXI标准同时定义了3U和6U模块适用的机械尺寸与连接器形式.3U模块在模块底部安装有一个助拔手柄.在顶部和底部通过螺钉固定,底部的固定螺钉部分隐藏在助拔手柄中.占用超过一个槽位的模块可以 ...
- 题解:CF559B Equivalent Strings
CF559B Equivalent Strings 题解 题目描述 吐槽一下,题目翻译有歧义. 思路分析 你会发现,当你需要判断字符串 \(a,b\) 是否等价时,如果长度为偶数,需要继续判断字符串 ...