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 ...
随机推荐
- C#轻松实现Modbus通信
1.前言 大家好!我是付工.前面给大家介绍了一系列关于RS485与Modbus的知识. 终于有人把RS485说清楚了终于有人把Modbus说明白了通透!终于把ModbusRTU弄明白了这样看来,Mod ...
- 集成InfluxDb, telegraf, Grafana, App Metrics以记录性能指标
前情概要 刚好有半天得闲功夫, 从项目里面找个功能来水一篇文章. 上线的项目通常都是需要做性能数据收集工作的, 它好处就不想打字了. 业界有很多套方案, 工具[收费的, 免费的], 收集采用[拉取的, ...
- RocketMQ Streams拓扑构建与数据处理过程
本文作者:倪泽,Apache RocketMQ committer.RSQLDB/RocketMQ Streams Maintainer 01 背景 RocketMQ Streams 1.1.0版本已 ...
- Effective C++:以const、enum和inline来替换define
替换define,也就是"以编译器替换预处理器".#define是C语言里的利器,但在C++里有很多取代它的理由. define是预处理的一部分,而不是编译器的一部分,它在编译前就 ...
- vue之JavaScript封装
导入js文件有很多种方式,我喜欢使用这种,感觉跟框架导入很相似.没有多余的沉湎. 定义一个js文件,比如util.js import Vue from "vue"; //===== ...
- Nuxt.js 应用中的 imports:sources 事件钩子详解
title: Nuxt.js 应用中的 imports:sources 事件钩子详解 date: 2024/10/27 updated: 2024/10/27 author: cmdragon exc ...
- JS转义html编码
两个方法: 1.利用用浏览器内部转换器实现html转义: 2.用正则表达式实现html转义: var HtmlUtil = { /*1.用浏览器内部转换器实现html编码(转义)*/ htmlEnco ...
- SaaS多租户的3种隔离模式
大家好,我是汤师爷~ 在SaaS模式下,多租户之间的资源隔离是基础且关键的一环.SaaS服务商需要在确保运营效率和控制成本的前提下,搭建一个让多个租户能够同时访问的共享环境. 虽然大家都在用同一套Sa ...
- 用Python创建一个简单的Web服务器
基本思路: 在浏览器地址栏通过输入本机地址:http://127.0.0.1:8000 能够访问我们自己创建的Web服务器,并且给浏览器返回一句Hello World 代码实现: 1 import s ...
- games101_Homework5
使用光线追踪来渲染图像,实现两个部分:光线的生成和光线与三角的求交 你需要修改的函数是: • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 ...