1. 关于在头文件中定义函数使用static关键字的血的教训。
  • 有时候我们需要将一些常用函数写在一个文件中供很多地方调用,如果写的是 int doxxx{} 这种,在你多个地方引用的时候,肯定会编译报错提示 “重复定义” 的错误。
  • 此时你需要在函数前面加上static关键字,变成 static int doxxx{} 这种,能够正常编译和运行,以为一切万事大吉,还是我太年轻。
  • 如果仅仅是一个类中在使用,或者函数中没有静态变量,也不会出问题,问题就在static修饰的函数在每个引入头文件的时候都会拷贝一份,导致函数里面的static静态变量会重复初始化,这样就不正确了。
  • 为了解决这个问题,终极办法就是在外面套个类,所有的函数和变量放到类中,完美,再也不会睡不着了,真香。
  • 关于C/C++ 中的static关键字,建议大家参考这篇文章写得 https://zhuanlan.zhihu.com/p/37439983,醍醐灌顶。
//文件名 test.h

//下面这个函数 编译报错提示 “重复定义”
void test() {} //下面4个函数在每个引入头文件的时候都会被拷贝一份
static void test1() {}
inline void test2() {}
static inline void test3() {}
inline static void test4() {} //保证没问题的写法
class tt {
void test() {}
static void test1() {}
inline void test2() {}
static inline void test3() {}
inline static void test4() {}
}
  1. 在数据库查询中,一般会建立索引以便加快查询速度,比如常用的条件字段作为索引字段。但是有些时候如果查询语句没写好,就算where中有索引字段也会引起全表扫描,也就是说根本没用上索引,这点要积极的避免。
  • 模糊查询like,全模糊 like '%...%' 和左模糊 like '%...' 无法直接使用索引,右模糊查询 like '...%' 会使用索引。
  • 查询条件中含有is null的select语句执行慢,is not null 时永远不会使用索引,一般数据量大的表不要用is null查询。
  • 不等于操作符 <> 和 != 会限制索引,引起全表扫描,即使比较的字段上有索引。
  • where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。
  • select count(*) from table 这样不带任何条件的count会引起全表扫描。
  • in 和 not in 也要慎用,否则会导致全表扫描,能用 between 就不要用 in。
  • 用 >= 替代 >,比如 高效写法:select * from table where id >= 4,低效写法:select * from table where id > 3。
  • 如果表数据量很小,比如就几千行,请忽略上述警告,加不加索引问题不大,甚至某些时候加索引反而大大增加了数据库文件的体积,影响更新数据库的速度。
  1. 由于Qt在不断的更新换代,各种组件轮子也在增加、拆分、调整等,所以我们在编写项目的时候,如果有版本兼容的问题,就需要在pro项目文件和代码文件中做对应的判断处理。根据多年的经验总结,一个万能的办法就是在pro中增加一个DEFINES标识,然后根据这个DEFINES标识引入对应模块,最后在代码中通过#ifdef判断标识执行对应代码。经过这样倒腾几下你的代码可以在低版本和高版本编译运行。
//pro pri 文件
//下面表示主版本>4子版本>6 即版本>=5.7
greaterThan(QT_MAJOR_VERSION, 4) {
greaterThan(QT_MINOR_VERSION, 6) {
DEFINES += qchart
}} //由于Qt6的发布以及以后Qt7、Qt8等,光有上面这个判断是不够的的
//下面表示Qt主版本>5 即版本>=6.0
greaterThan(QT_MAJOR_VERSION, 5) {
DEFINES += qchart
} //判断有定义则导入对应模块
contains(DEFINES, qchart) {
QT += charts
} //代码文件
#ifdef qchart
//要执行的代码
#endif
  1. 在使用QChart图表控件的时候,你会发现默认的边距好大,很多时候我们希望能显示更多的信息,紧凑型的界面,所以需要设置边距。
//设置背景区域圆角角度
chart->setBackgroundRoundness(0);
//设置内边界边距
chart->setMargins(QMargins(0, 0, 0, 0));
//设置外边界边距
chart->layout()->setContentsMargins(0, 0, 0, 0);
  1. Qt内置了数据压缩和解压的功能,如果遇到图片、音频数据、文件等转base64传输这种,采用qCompress压缩后大概可以节省30%的数据传输量,压缩性能可观。前提是双方都是Qt程序,因为收到数据的时候还要用qUncompress解压出来,成对出现的。
//发送的时候压缩下数据
QByteArray buffer = "...";
buffer = qCompress(buffer);
socket->write(buffer); //收到数据后务必记得先解压再使用
QByteArray data = socket->readAll();
data = qUncompress(data);

国内站点:https://gitee.com/feiyangqingyun

国际站点:https://github.com/feiyangqingyun

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

  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. ajax异步请求数据还没有返回,页面时空白的如何处理

    使用骨架屏,给用户一种正在解析数据的感觉 : element-ui的骨架屏 :https://element.eleme.cn/#/zh-CN/component/skeleton

  2. Kali Linux 各版本开启ssh 服务

    Kali Linux 各版本开启ssh 服务 2019版kali Linux SSH链接办法 修改kali关于SSH服务默认配置并重启SSH服务,步骤如下: 打开sshd_config文件 leafp ...

  3. 为重复使用的HttpClient对象动态修改Timeout

    最近博客园被**了, 赶紧水一文支持一下博客园,加油! 问题现象 当HttpClient被使用过之后, 在修改它们的属性会抛出错误This instance has already started o ...

  4. KubeSphere 社区双周报|2024.03.15-03.29

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  5. 全局负载均衡、CDN内容分发的原理与实践

    CDN简介 CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发. ...

  6. Vue最受欢迎的七大跨端框架,你都用过哪几个?

    随着移动互联网的快速发展,开发者们不仅需要为Web开发,还需要兼顾iOS.Android.小程序等多个平台.这让"跨端开发"成为了炙手可热的话题.而基于Vue的跨端框架凭借其优异的 ...

  7. Top100题(上)

    Top100(上) 散列 1. 两数之和 struct MyListNode { int val; int pos; struct MyListNode *next; }; // 散列表 typede ...

  8. Machine Learning Week_8 K-means And PCA

    目录 1 K-means 1.1 Unsupervised Learning:Introduction 1.2 K-Means Algorithm 1.2.1 k-means algorithm 1. ...

  9. spring boot--@Value注解失效

    接手一个任务开发预警邮件需求,计划将邮件信息(hostName,用户名,密码,发送方,接受方等)设置为可配置变量,配置在配置中心,使用@Value注解获取配置,如下: @Value("${w ...

  10. 【Python】公众号聚合登录软件+源码

    废话不多说了,直接上图,回复拿软件和源码[自己打包,配置环境比较复杂] 写这个软件就是因为其他平台的会员太贵了,还不如自己写个,不限制账号登录数~ 授权,打开和删除功能都是正常的, 面板功能,我打算做 ...