Qt/C++开发经验小技巧316-320

  1. 将QPointF转成经纬度坐标字符串的时候,默认会丢失精度,导致计算错误,尤其是在转换成经纬度坐标的时候,可以发现偏差很大,所以在转换的时候需要指定精度。
cpp 复制代码
QPointF p(1.23456789, 2.3456789);
QString p1 = QString("%1,%2").arg(p.x()).arg(p.y());
QString p2 = QString("%1,%2").arg(p.x(), 0, 'f', 10).arg(p.y(), 0, 'f', 10);
qDebug() << p1 << p2;
//p1=1.23457,2.34568  p2=1.2345678900,2.3456789000
  1. 在C++中经常会需要引入一些第三方或者系统的头文件,有时候你会发现,如果单单写个类,就引入这个文件,是没有任何问题的,而如果在前面还引入了Qt中的头文件比如 #include ,会编译通不过,报一些奇奇怪怪的问题,此时就要考虑引入的顺序问题,一般来说,要把Qt中的头文件放到后面来引入,就不会有问题,血淋淋的教训,折腾了很久才发现。貌似Qt中的头文件也会引入一些系统层面的头文件,而且还加了一些自己的定义,导致和第三方库的定义冲突了。一般来说msvc编译器最容易遇到这个现象,mingw出奇的正常。

  2. 当使用部分Qt内置的样式风格比如fusion的时候,QComboBox下拉框设置最大可见数量setMaxVisibleItems会失效,导致下拉框元素很多的时候,会填充整个屏幕,需要设置个样式就可以正常应用setMaxVisibleItems。ui->comboBox->setStyleSheet("combobox-popup:0;");

  3. 将字符串的浮点数转换成整型,会出现不可预期的结果,比如可能转换失败结果是0,不要以为这个转换会给你自动取整,其实不会的,除非本身是整型的字符串,这种规则只有在强类型的语言(比如c++/java)中才有,在弱类型的语言(比如js/python)中结果是正常的。这个规则要特别注意,那如果要正常转换怎么办?可以先转成浮点数再转整型即可。

cpp 复制代码
QString s = "12.563";
//结果输出0
qDebug() << s.toInt();
//结果输出12
qDebug() << s.toFloat();
int i = s.toFloat();
  1. 关于QByteArray变量取值注意事项的衍生问题。
cpp 复制代码
QString s = "abc";
//变量c的值很可能不正确/toUtf8后是个临时变量
char *c = s.toUtf8().data();
//需要分成两步
QByteArray b = s.toUtf8();
char *c = b.data();

//那么问题来了/下面这个b有没有问题
QByteArray b = s.toUtf8().toBase64();
//其实没有问题的/因为toBase64后返回的是一个新的对象
//99%的人看到c有问题以为b也有问题