QString的作用
QString是Qt类库中一个重要的字符串类,在Qt应用程序开发中扮演着非常重要的角色。尤其是 在人机交互中,所有需要用户输入或向用户展示的内容,最终都以字符串的形式存在,比如UI界面、文本文件数据、数据库等。
QString 提供了对 Unicode 字符串的完整支持,这意味着它可以用于处理任何语言和字符集,包括非拉丁语系字符集,如中文、日文或俄文等。
QString提供了丰富的字符串操作和处理功能,可以用于存储和操作文本数据、显示图形界面文本、序列化和反序列化数据、处理文件和目录路径等方面。
QString为开发者提供了一种可靠、高性能和跨语言字符编码方案,从而确保用户界面和输入输出数据在各种语言和字符集之间的正确显示和操作。同时,在 QT 中使用 QString 还可以获得更好的内存管理、线程安全性和故障容错性等优点,保证了程序的稳定性和可靠性
QString主要作用如下:
-
存储和操作文本数据
QString类可以方便地存储字符串和文本数据,并支持各种字符串操作,比如插入、删除、替换、裁剪、格式化等操作。由于QString实现了深拷贝机制,因此即使在多个对象之间复制或赋值时,也能保证数据的共享和安全性。
-
显示图形界面文本
在Qt应用程序中,大量使用了QString来显示和处理用户界面上的文本数据,如按钮、标签、输入框、文本编辑器、表格等组件都可以使用QString类进行初始化和显示。同时,QString类还支持各种国际化和本地化特性,可以用来实现不同语言环境下的本地化文本。
-
序列化和反序列化数据
QString类还可以将各种复杂的数据类型(如JSON、XML、URL等)转换为字符串表示形式,并且可以将这些字符串反序列化为原始数据类型。这种方式对于网络应用程序的数据传输、存储和交互非常有用。
-
处理文件和目录路径
由于QString支持各种字符串操作,因此可以很方便地处理文件和目录路径相关的字符串。在Qt中,很多文件和目录的操作都是基于QString类来实现的。
QString使用注意事项
隐式共享
QString类采用了隐式共享 (copy-on-write) 的内存分配机制。这意味着在 QString 对象拷贝时,实际上只有引用计数会被增加,而不会立即拷贝相应的数据。当对象需要对字符串数据进行修改时,才会创建并拷贝一份独立的数据,并将引用计数-1,以确保该数据只有一个副本被修改。
由于这种设计,许多 QString 对象可以共享相同的数据,并且在传递 QString 参数时形参和实参之间也只是简单地增加了引用计数(除非在函数中修改了形参对象的值)。因此,QString 类能够大量节省内存空间,并具有快速的复制操作。
内存动态扩展
在 QString 中,内存的动态扩展是按照字符进行的。QString 以 16 bit 的 QChar 存储每个字符,其大小固定为 2 字节。当添加一个字符到 QString 中时,首先会检查当前 QString 对象的存储空间是否足够,如果不够,则需要将它的存储空间扩展到足够大的值。
当需要动态扩展 QString 的内存空间时,QString 使用自适应增长策略来平衡内存使用和性能。默认的增长因素是 2,这意味着每次需要新增内存时,都会将当前的容量乘以 2,并分配新的内存空间。不过,在某些情况下,可能会使用其他的增长因子,例如:
- 当字符串长度较短(小于预定义的阈值),增长因子可能是 1.125。
- 当字符串长度超过预定义的一定阈值(默认情况下是 4096),则会采用分块存储的方式,每块的大小也会根据当前字符串长度而做出调整。
需要注意的是,在每次内存重新分配后,所有数据都必须复制到新的内存中,这可能会导致性能问题。为了避免这种情况,请尽量避免频繁地修改已有的 QString 对象,或者在创建 QString 对象时使其具有合适的初始大小和空间预留。
格式化输出
//将tempDouble转换为字符串,保留两位小数(四舍五入)
QString strTemp = QString::number(tempDouble,'f',2);
//将一个字节的整数转换为16进制字符串,位宽为2,如果不足,则补‘0’。
QString strData = QString("%1").arg(uchar(byte),2,16,QLatin1Char('0')).toUpper();
QVariant<double>或QVariant<QString>,转换QString,需要根据转换后的情况进行特殊处理,直接转换后可能包含小数点或者科学计数法,若不处理,则后续将无法再继续转换为整数进行其他处理。
QString strsTemp = var.toString();
if(strsTemp.contains('.')
||strsTemp.contains("e+")
||strsTemp.contains("e-"))
{
double tempDouble = var.toDouble();
strTemp = QString::number(tempDouble,'f',0);
}
else
{
strTemp = var.toString();
}
QString的常用方法
-
构造函数:
QString():构造一个空字符串。
QString(const char *str):用C风格字符串初始化QString对象。
QString(const QByteArray &ba):用QByteArray初始化QString对象。
QString(char c):构造一个只有一个字符c的字符串。
QString(const QString &other):拷贝构造函数。
-
常见操作:
isEmpty():判断字符串是否为空。
isNull():判断字符串是否为NULL。
size()和length():获取字符串的长度。
trimmed():去除字符串两端的空白字符。
simplified():去除字符串两端空白符并合并内部连续空白字符。
toUpper()和toLower():将字符串转换为大写或小写。
indexOf()和lastIndexOf():查找指定子串在字符串中出现的位置。
replace():替换指定子串为另一字符串。
split():将字符串以指定分隔符分割成多个子串。
compare()、startsWith()、endsWith():判断字符串的内容、开头和结尾
-
赋值和连接:
operator=:赋值运算符,可以将一个QString对象赋值给另一个QString对象。
append()和operator+:在字符串末尾追加另一个字符串。
prepend():在字符串开头插入另一个字符串。
mid():截取字符串的一部分。
-
转换:
toInt()和toDouble():将字符串转换为整数或浮点数。
number():将整数或浮点数转换为QString。
toLatin1()和toUtf8():将QString对象转换为QByteArray。
fromLatin1()和fromUtf8():将QByteArray转换为QString对象。
fromStdString():将C++标准库字符串转为QString。
toStdString():将QString转为C++标准库字符串。
arg():可以将新字符串插入到包含占位符%1、%2等的原始字符串中
QString的使用示例
#include <QString> #include <QDebug> int main() { // 1. 创建QString对象 QString str1 = "hello"; QString str2(" world"); QString str3(10, 'a'); // 2. 打印字符串内容 qDebug() << "str1: " << str1; qDebug() << "str2: " << str2; qDebug() << "str3: " << str3; // 3. 字符串拼接 str1 += str2; qDebug() << "str1 + str2: " << str1; // 4. 字符串长度、是否为空 int len1 = str1.length(); // 获取字符串长度 bool isEmpty = str2.isEmpty(); // 判断字符串是否为空 qDebug() << "str1 length: " << len1; qDebug() << "str2 isEmpty: " << isEmpty; // 5. 字符串比较 QString str4("android"); QString str5("Android"); bool isEqual = (str4 == str5); // 判断两个字符串是否相等(区分大小写) bool isSame = (str4.toLower() == str5.toLower()); // 判断两个字符串是否相等(不区分大小写) qDebug() << "str4 == str5: " << isEqual; qDebug() << "str4 equalsIgnoreCase str5: " << isSame; // 6. 字符串查找和替换 QString str6("Hello, world!"); int index1 = str6.indexOf(","); // 查找指定字符在字符串中的位置 QString str7 = str6.replace("world", "QT"); // 将字符串中某个部分替换成新的字符串 qDebug() << "str6 index of ',': " << index1; qDebug() << "str6 replace 'world' with 'QT': " << str7; // 7. 字符串转换 double pi = 3.1415926; QString str8 = QString::number(pi, 'f', 2); // 将数字转换为字符串 QString str9 = "128"; int val = str9.toInt(); // 将字符串转换为整数 qDebug() << "pi as string: " << str8; qDebug() << "str9 as integer: " << val; return 0; }
程序运行结果:
str1: "hello"
str2: " world"
str3: "aaaaaaaaaa"
str1 + str2: "hello world"
str1 length: 11
str2 isEmpty: false
str4 == str5: false
str4 equalsIgnoreCase str5: true
str6 index of ',': 5
str6 replace 'world' with 'QT': "Hello, QT!"
pi as string: "3.14"
str9 as integer: 128