QString类 基本说明:
编码格式:提供了一个Unicode字符字符串
存储方式:存储了一个16位QChars字符串,其中每个QChar对应一个Unicode 4.0字符
优势 :使用隐式共享(即写即复制)来减少内存使用并避免不必要的数据复制
扩展 :除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位'\0'结尾的字符串,QByteArray适用于两种主要情况是:当需要存储原始二进制数据时,以及内存保护非常重要(比喻嵌入式系统中)时
一 、 QString 转 (int , float , double,char*, string, QByteArray)
1. 不使用参数
/************** qstring 转 其他(不添加参数)******************//
int main()
{
QString str = "111.22";
QString str1 = "aa";
double toDouble = str.toDouble(); //val:111.22
float toFloat = str.toFloat(); //val: 111.2200012
int toInt = str.toInt(); //val: 0
int toInt2 = str1.toInt(); //val: 0
QString str2 = "hello world";
//错误方式
const char *toChar = str2.toLocal8Bit().data();//val:乱码(错误示范)
const char *toChar1 = str2.toStdString().data();//val:乱码(错误示范)
//正确方式
QByteArray byteArray = str2.toLocal8Bit();//val:"hello world"
std::string string1 = str2.toStdString();//val:"hello world"
const char* toChar2 = byteArray.data();
const char* toChar3 = string1.data();
return 0;
}
2. 使用参数
///************** qstring 转 其他(添加参数) ******************//
int main()
{
QString str = "111.22";
QString str1 = "FF";
bool ok;
double toDouble = QString("1111.22e-02").toDouble(&ok); //val:ok = true; toDouble = 11.1122
float toFloat = str.toFloat(&ok); //val:0; ok = false
int toDec = str.toInt(&ok, 10); //val: 0; ok = false
int toHex = str.toInt(&ok, 16); //val: 0; ok = false
int toDec1 = str1.toInt(&ok, 10); //val: 0; ok = false
int toHex1 = str1.toInt(&ok, 16); //val: 255; ok = true
return 0;
}
3. 注意事项:
①浮点数的存储。
当QString 转 float 时 会多存几位不用的数据,一般情况下,需要用浮点运算的地方建议用 double , 有精度要求的浮点运转转成 int 后再存储。
②QString 转 char* 要考虑字符集的问题。
utf16字符集下每个字母都是2个字节,utf8下是8个字节。看到网上有直接转char*的,下面源码中有错误示范方式,有正确示范方式。
二、(int , float , double) 转 QString
///**************其他 转 qstring ******************//
int main()
{
long long1 = 22;
int int1 = 22;
double double1 = 22.22;
QString longToStr = QString::number(long1, 10);//val: "22"
QString longToStr2 = QString::number(long1, 16).toUpper();//val: "16"
QString longToStr3 = QString("%1").arg(long1);//val: "22"
QString intToStr = QString::number(int1);//val: "22"
QString doubleToStr = QString::number(double1);//val: "22.22"
return 0;
}
三、访问 QString 中的字符
/************** 访问 qstring 中的字符 ******************//
int main()
{
QString str = "hello wrold";
QString aa = str[1]; //val:"e"
QString bb = str.at(1); //val:"e"
QString left = str.left(2); //val:"he"
QString right = str.right(2); //val:"ld"
QString mid = str.mid(0, 2); //val:"he"
return 0;
}
详细说明:
- 操作符 [ ] 访问: QString像c++数组一样使用基于0的索引。对于非const字符串,操作符[]返回一个对字符的引用,该字符可用于赋值的左侧
- at() 访问 : 当只读访问某个字符时,可以使用at()。优势:at()函数可以比运算符[]更快,因为它不会导致深度复制。
- left()、right()、mid: 一次提取几个字符
四、操作 QString 数据
/************** 操作 qstring 中的数据 ******************//
int main()
{
QString str = "hello wrold";
str.prepend("aaaa "); //val:"aaaa hello wrold"
str.append(" bbbb"); //val:"aaaa hello wrold bbbb"
str.replace(0, 3, "0"); //val:"0a hello wrold bbbb"
str.remove(0, 4); //val:"ello wrold bbbb"
//size()
QString str2 = "hello";
int size = str2.size();
//resize()
str2.resize(10);
int size2 = str2.size();
//fill()
str2.fill("z");
//遍历所有出现字符串的地方
int index = 0;
while(index = str.indexOf("bb",index) != -1)
{
qDebug() << index;
++index;
}
return 0;
}
详细说明:
- append()、prepend()、insert()、replace()、remove():修改字符数据
- size() : 获取整个字符串的大小。
- resize(): 重新分配字符串大小,新分配的字符具有未定义的值。
- fill(): 将字符串中的所有字符设置为特定值
- indexOf():遍历是否存在字符
五、查询字符串数据
/************** 查询 qstring 中的数据 ******************//
int main()
{
QString str = "hello wrold";
bool bool1 = str.startsWith("he"); //val:true
bool bool2 = str.endsWith("old"); //val:true
bool bool3 = str.contains("ll"); //val:true
int count = str.count("l"); //val:3
bool bool4 = (str == "hello"); //val:false
return 0;
}
详细说明:
- startsWith()或endsWith():查看QString是否以特定的子字符串开始或结束
- contains():查看QString是否包含特定的字符或子字符串
- count(): 查看一个特定的字符或子字符串在字符串中出现了多少次
- 操作符==():比较两个字符串是否相等
六、Null 和 Empty 之间的区别
QString().isNull(); // returns true
QString().isEmpty(); // returns true
QString("").isNull(); // returns false
QString("").isEmpty(); // returns true
QString("abc").isNull(); // returns false
QString("abc").isEmpty(); // returns false
详细说明:
- null string: 是使用QString的默认构造函数或通过将(const char *)0传递给构造函数来初始化的字符串。
- empty string :是任何大小为0的字符串。
null string总是空的,但是empty string不一定是空的:
注:除isNull()之外的所有函数都将 null strings视为 empty strings。例如,toUtf8(). constdata()为null string返回一个指向'\0'字符的指针(不是空指针)。
QString()与QString("")比较。建议您始终使用isEmpty()函数,并避免使用isNull()函数。