结合网络博客和QT文档总结而成。
1、概述
1.1 QString 类是 Qt 中用于表示字符串的类,实现在 QtCore 共享库中。QString 类在实现上有以下特征:
1)字符串采用 Unicode 内部编码,可以表示世界上大多数语言的文字;
2)字符串的存储有引用计数,当一个 QString 对象被复制为另一个 QString 对象时,它们实际上指向相同的存储空间,仅仅是增加一个引用计数;
3)隐式共享:采用隐式共享,只要不涉及到写的时候所有公用的只指向一个内存区域,只有在写的时候才进行写时复制。这一点和 *** 作系统的写时复制类似。
注意:QT中还有很多的类似类,都是采用的隐式共享机制,本人在开发的时候就吃过由隐式共享带来的bug,原因不了解该机制,也不熟悉,然后使用了.detach()才解决。
定义了一个QString字符串以后,经常用的 *** 作会控制字符串中的一些内容,这就和数据库一样,经常会有一些增删改查的需求,只不过这些需求会更加细粒度的划分出来怎么去 *** 作
比如:
增:
在字符串的前(prepend())和 后(append())添加字符串或者字符;
insert()在指定位置添加字符串或者字符;
删
remove()在指定位置移除多个字符串;
trimmed()除去字符串两端的空白字符,包括"t" “n” “v” “f” “r” “” ;
simplified()在除去字符串两端空白字符的同时,并且将字符串中间的空白字符序列替换为一个空格。
改
split()将一个字符串分割成多个子字符串;
“+” 使用+ *** 作符来组合两个字符串。
查
contains() 函数判断该字符串是否包含一个指定的字符或者字符串;
count() 获得字符串中的一个字符或者子字符串出现的次数。
注意:
isNull()和isEmpty()是有区别的,如果遇到空字符,isNull()是判断为false,isEmpty()判定为true;一般使用isEmpty()来判断字符串是否为空,使用isNull判断是不够准确的。
#include下标查询#include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << QObject::tr("以下是编辑字符串操作:") << endl; QString str = "hello"; // 执行下面一行代码,大小为5 qDebug() << QObject::tr("字符串大小:") << str.size(); str[0] = QChar('H'); // 将第一个字符换为‘H' // 执行下面一行代码,结果为‘H' qDebug() << QObject::tr("第一个字符:") << str[0]; //Hello str.append(" Qt"); // 向字符串后添加"Qt" Hello Qt qDebug() << QObject::tr("str为:") << str; str.replace(1,4,"i"); // 将第1个字符开始的后面4个字符替换为字符串"i"是第一到第四个这四个仅用一个i代替 (Hiiii Qt错误) qDebug() << QObject::tr("str为:") << str; str.insert(2," my"); // 在第2个字符后插入" my"Hi myiii Qt // 执行下面一行代码,结果为Hi my Qt qDebug() << QObject::tr("str为:") << str; str = str + "!!!"; // 将两个字符串组合 // 执行下面一行代码,结果为Hi my Qt!!! qDebug() << QObject::tr("str为:") << str; str = " hirn Qt!n "; qDebug() << QObject::tr("str为:") << str; QString str1 = str.trimmed(); // 除去字符串两端的空白字符 qDebug() << QObject::tr("str1为:") << str1; QString str2 = str.simplified(); // 除去字符串两端和中间多余的空白字符 //结果为hi Qt! qDebug() << QObject::tr("str2为:") << str2; str = "hi,my,,Qt"; // 从字符串中有","的地方将其分为多个子字符串, // QString::SkipEmptyParts表示跳过空的条目 QStringList list = str.split(",",QString::SkipEmptyParts); // 执行下面一行代码,结果为hi,my,Qt qDebug() << QObject::tr("str拆分后为:") << list; str = list.join(" "); // 将各个子字符串组合为一个字符串,中间用" "隔开 // 执行下面一行代码,结果为hi my Qt qDebug() << QObject::tr("list组合后为:") << str; qDebug() << QString().isNull(); // 结果为true qDebug() << QString().isEmpty(); // 结果为true qDebug() << QString("").isNull(); // 结果为false qDebug() << QString("").isEmpty(); // 结果为true QString text = " zj 999 "; text = text.trimmed();//去除字符的前后空格 qDebug() << "text = " << text; int i = text.count(' '); qDebug() << "i = " << i; if (i != 1) { text = text.replace(QRegExp("\s+"), " ");//多个空格合并成一个空格 //text = text.simplified(); // 除去字符串两端和中间多余的空白字符(也可多个空格合并成一个空格) qDebug() << "1 text = " << text; } else { text = text.remove(QRegExp("\s+")); qDebug() << "2 text = " << text; } return a.exec(); }
上面的 *** 作字符串增加 *** 作中,更加细粒度 *** 作一点,具体到每一个位置的 *** 作
right()、left()、mid()、分别提取一个字符串最右面、最左面、中间含有多个字符的子字符串;
indexOf()函数获取一个字符或者子字符串在该字符串中的位置;
at()函数获取一个指定位置的字符,比" [ ] " *** 作符要快很多,不会引发深拷贝;
startsWith()和endsWidth()函数判断该字符串是以一个字符或者字符串开始或者结束的;
%1……n的显示方式。
#include#include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << endl << QObject::tr("以下是在字符串中进行查询的操作:") < str) qDebug() << temp; else qDebug() << str; return a.exec(); }
关于数字转换显示和 使用“%1”和arg()的显示方式
qDebug() << endl << QObject::tr("以下是字符串的转换操作:") << endl; str = "100"; // 结果为100 qDebug() << QObject::tr("字符串转换为整数:") << str.toInt(); int num = 45; //结果为"45" qDebug() << QObject::tr("整数转换为字符串:") << QString::number(num); str = "FF"; bool ok; int hex = str.toInt(&ok, 16); // 结果为ok:true 255 qDebug() << "ok: "<< ok << QObject::tr("转换为十六进制:") << hex; num = 26; //结果为1a qDebug() << QObject::tr("使用十六进制将整数转换为字符串:")<< QString::number(num, 16); str = "123.456"; //结果为123.456 qDebug() << QObject::tr("字符串转换为浮点型:") << str.toFloat(); str = "abc"; // 结果为ABC qDebug() << QObject::tr("转换为大写:") << str.toUpper(); str = "ABC"; // 结果为abc qDebug() << QObject::tr("转换为小写:") <以上最常见的几种使用方法,几乎在所有项目中我都涉及到上述使用QString的方法,当然,后面还会继续补充。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)