前提概要 (英译汉)
该QString的类提供了一个Unicode字符串。
QString存储一串16位QChar,每个QChar对应一个Unicode 4.0字符。(代码值大于65535的Unicode字符使用代理对存储,即两个连续的QChar。)
Unicode是一种国际标准,支持当今大部分使用的书写系统。它是US-ASCII(ANSI X3.4-1986)和Latin-1(ISO 8859-1)的超集,所有US-ASCII / Latin-1字符都可以在相同的代码位置获得。
在幕后,QString使用隐式共享(copy-on-write)来减少内存使用量并避免不必要的数据复制。这也有助于降低存储16位字符而不是8位字符的固有开销。
除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位’\ 0’终止的字符串。对于大多数目的而言,QString是您想要使用的类。它在整个Qt API中使用,Unicode支持确保您的应用程序易于翻译,如果您想在某个时候扩展您的应用程序市场。QByteArray适合的两种主要情况是当你需要存储原始二进制数据,并且当内存保存是关键的时候(比如在嵌入式系统中)。
QString 初始化(练习与归纳)
1、构造 QString(空字符串)
原型 QString :: QString()
QString str;
2、QChar数组转QString
原型 QString::QString(const QChar * unicode,int size = -1)
Note:
a.构造一个用QChar数组unicode的第一个大小字符初始化的字符串。
b.如果unicode为0,则构造一个空字符串。
c.如果大小为负数,则假定unicode指向一个以nul结尾的数组,并且其长度是动态确定的。终止的空字符不被视为字符串的一部分。
d. QString对字符串数据进行深层复制。unicode数据按原样复制,并且字节顺序标记保留(如果存在)。
例如:
static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
QString str(data, 4);
或
static const QChar data[4] = { "0055", "006e", "10e3", "03a3" };
QString str(data, 4);
3、由QChar字符对象构造
原型 QString :: QString(int size,QChar ch)
QString :: QString(QChar ch)
4、先用 resize() 定义 QString 的大小,再根据索引依次赋值
QString str;
str.resize(4);
qDebug() <<"1"<< str << endl;
str[0] = QChar('U');
qDebug() <<"2"<< str << endl;
str[1] = QChar('n');
qDebug() <<"3"<< str << endl;
str[2] = QChar(0x10e3);
qDebug() <<"4"<< str << endl;
str[3] = QChar(0x03a3);
qDebug() <<"5"<< str << endl;
打印结果为:
1 "\u0000\u0000\u0000\u0000"
2 "U\u0000\u0000\u0000"
3 "Un\u0000\u0000"
4 "Un?\u0000"
5 "Un?Σ"
有乱码是因为内存 0x10e3 和 0x03a3 为混沌状态。
注意:定义QString大小之后,任然可以对更大的索引空间进行赋值,且不限制于连续索引号
5、字符串构造QString
原型 QString :: QString(const char * str)
例如 QString str("123abc");
6、Latin1编码的字符串构造
原型 QString :: QString(QLatin1String str)
7、QString浅拷贝构造QString
原型 QString::QString(QString &&other)
8、QString深拷贝构造QString
原型 QString::QString(const QString &other)
9、QByteArray深拷贝构造QString
原型 QString :: QString(const QByteArray&ba)
QString字符串末尾追加字符串
三个相关的Qt库函数:append()、insert()、operator+=()
库函数一:append()
特性:append()函数通常非常快,因为QString会在字符串数据的末尾预先分配额外的空间,所以它可以在不重新分配整个字符串的情况下进行增长。
// 将字符串str追加到该字符串的末尾
QString&QString :: append(const QString& str)
// 将QChar数组str中的len字符追加到此字符串中
QString&QString :: append(const QChar * str, int len)
// 将字符ch附加到此字符串。
QString&QString :: append( QChar ch)
// 将给定的字符串引用附加到此字符串并返回结果
QString&QString :: append(const QStringRef& reference)
// 将Latin-1字符串str追加到此字符串
QString&QString :: append( QLatin1String str)
// 将字符串str追加到此字符串。使用fromUtf8()函数将给定的const char指针转换为Unicode 。可以通过定义QT_NO_CAST_FROM_ASCII何时编译应用程序来禁用此函数
QString&QString :: append(const char * str)
// 将字节数组ba添加到此字符串中。也可以通过定义QT_NO_CAST_FROM_ASCII禁用该函数
QString&QString :: append(const QByteArray& ba)
库函数二: insert()
示例 x.insert(x.size(), y);
库函数三:operator+=()
示例 QString stra = "123", strb = "456";
stra += strb;
QString字符串格式化
QString QString::arg(const QString&a ,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(char a,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(QChar a,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(long a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(ulong a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(int a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(uint a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(short a,int fieldWidth = 0,int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(ushort a,int fieldWidth = 0,int base = 10, QChar fillChar = QLatin1Char(''))const
QString QString::arg(double a,int fieldWidth = 0,char format ='g',int precision = -1,QChar fillChar = QLatin1Char(''))const
QString QString::arg(qlonglong a,int fieldWidth = 0,int base = 10, QChar fillChar = QLatin1Char(''))const
QString QString::arg(const QString& a1,const QString& a2)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7,const QString& a8)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7,const QString& a8,const QString& a9)const
arg的重载形式共 19 个,有点多,这里归纳下(根据序号描述):
1-2:参数一是字符串
3:参数一可能是字符串,也可能是16进制的数值
4~11:参数一是数值,参数三可指定进制(2、8、10、16)
12~19:每个参数都是一个 “%”,实现一次性替换
注意13-20的重载形式有个坑:
BUG:当编号的位置标记不是空格分隔时会发生类似的问题
QString str;
str = "%1%3%2";
str.arg("Hello").arg(20).arg(50); //返回“Hello500”
str = "%1%2%3";
str.arg("Hello").arg(50).arg(20); //返回“Hello5020”
程序执行步骤:
1、首先,Hello替换%1这样的字符串变成”Hello%3%2”。
2、然后,20替换%2这样的字符串变成”Hello%320”。
3、由于最大编号的位置标记值为99,因此会被50替换%32。
因此,最终变成了”Hello500”。
如何避开?
假设 “%” 的编号顺序不是 从左至右,咱们可以这样避开BUG
QString str;
str = "%1%2%3";
str.arg("Hello", QString::number(20), QString::number(50)); // returns "Hello5020"
另外,还有 asprintf() 和 QTextStream() ,暂且不做它俩相应的练习
删除QString字符串末尾的指定长度字符
原型 void QString :: chop(int n)
注意 如果n大于或等于size(),则结果为空字符串; 如果n是负数,则相当于传递零。
用法
QString str("LOGOUT\r\n");
str.chop(2);
// str == "LOGOUT"
返回QString字符串左边指定长度字符
原型 void QString::truncate(int position)
注意 如果指定的位置索引超出了字符串的末尾,则不会发生任何事情。
用法
QString str = "Vladivostok";
str.truncate(4);
// str == "Vlad"
移除QString字符串指定索引的指定长度字符(并返回最新字符串)
原型 QString&QString :: remove( int position, int n)
注意 如果指定的位置索引位于字符串内,但位置 + n超出了字符串的末尾,则字符串将在指定的位置截断
用法
QString s = "Montreal";
s.remove(1, 4);
// s == "Meal"
删除QString字符串中的某个字符(可区分大小写)
原型 QString&QString :: remove( QChar ch, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)
注意 默认是Qt :: CaseSensitivity,即默认不分大小写,且参数ch不限制搜索字符或字符串
用法
QString t = "Ali Baba";
t.remove(QChar('a'), Qt::CaseInsensitive);
// t == "li Bb"
或
replace(t, 'a', Qt::CaseInsensitive);
在QString字符串中删除正则匹配的字符串
原型1 QString &QString::remove(const QRegExp &rx)
原型2 QString&QString :: remove(const QRegularExpression& re)
注意 区别在于 QRegExp 和 QRegularExpression
用法
QString r = "Telephone";
r.remove(QRegExp("[aeiou]."));
// r == "The"
QString r = "Telephone";
r.remove(QRegularExpression("[aeiou]."));
// r == "The"
返回一个字符串的复数
原型 QString QString::repeated(int times) const
注意 如果times小于1,则返回空字符串
用法
QString str("ab");
str.repeated(4); // returns "abababab"
替换QString字符串中指定范围的子字符串
原型 QString &QString::replace(int position, int n, const QString &after)
注意 如果指定的位置索引位于字符串内,但位置 + n超出了字符串范围,则将调整n以停止在字符串末尾
用法
QString x = "Say yes!";
QString y = "no";
x.replace(4, 3, y);
// x == "Say no!"
QString返回一个小写字符串
原型 QString QString :: toLower()const
用法
QString str = "The Qt PROJECT";
str = str.toLower(); // str == "the qt project"
QString返回一个大写字符串
原型 QString QString::toUpper() const
用法
QString str = "TeXt";
str = str.toUpper(); // str == "TEXT"
数据类型转换
最终参数ok的值会表达转换是否成功
QString转qint64:
原型 qlonglong QString::toLongLong(bool *ok = Q_NULLPTR, int base = 10) const
QString str = "FF";
bool ok;
qint64 hex = str.toLongLong(&ok, 16); // hex == 255, ok == true
qint64 dec = str.toLongLong(&ok, 10); // dec == 0, ok == false
QString转long:
原型 long QString::toLong(bool *ok = Q_NULLPTR, int base = 10) const
QString str = "FF";
bool ok;
long hex = str.toLong(&ok, 16); // hex == 255, ok == true
long dec = str.toLong(&ok, 10); // dec == 0, ok == false
QString转double
原型 double QString::toDouble(bool *ok = Q_NULLPTR) const
QString str = "1234.56";
double val = str.toDouble(); // val == 1234.56
或
bool ok;
double d;
d = QString( "1,234,567.89" ).toDouble(&ok); // ok == false
d = QString( "1234,56" ).toDouble(&ok); // ok == false
d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56
数值转QString字符串
库函数 setNum
QString都可以由这些类型转换:ushort、short、uint、long、ulong、qlonglong、float、double
用法
uint len = 0x20;
QString str;
str.setNum(len, 16);
注意 float 和 double 的重载形式可以用参数二设置语言的格式
拆分QString字符串
库函数一:split
库函数二:splitRef
库函数三:section
区别:返回数据的类型不同,一是返回QStringList,二是返回QVector < QStringRef >
split重载形式有:
QStringList QString :: split(const QString& sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QStringList QString :: split( QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QStringList QString :: split(const QRegExp& rx, SplitBehavior behavior = KeepEmptyParts)const
QStringList QString :: split(const QRegularExpression& re, SplitBehavior behavior = KeepEmptyParts)const
splitRef重载形式有:
QVector < QStringRef > QString :: splitRef(const QString& sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QVector < QStringRef > QString :: splitRef( QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QVector < QStringRef > QString :: splitRef(const QRegExp& rx, SplitBehavior behavior = KeepEmptyParts)const
QVector < QStringRef > QString :: splitRef(const QRegularExpression& re, SplitBehavior behavior = KeepEmptyParts)const
split 和 splitRef 重载形式的规律
参数一输入类型有 const QString、QChar、const QRegExp、const QRegularExpression
参数二是设置大小写匹配是否开启,默认不开启
section重载形式
QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QString &sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QRegExp ®, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QRegularExpression &re, int start, int end = -1, SectionFlags flags = SectionDefault) const
理解 根据参数一的要求,将字符串拆分为子字符串,然后参数二选定从第几个子字符串开始,而参数三选定从第几个字符串结束,并返回这个范围的字符串的引用。(参数flags是一个枚举类型,对应的枚举值会影响返回的行为)
注意 返回的所有引用都是会跟着字符串的销毁而变为野指针,只是浅拷贝的实例而已。
去除QString开头与结尾的空白 以及中间的特殊字符
原型 QString QString::simplified() const
用法
QString str = " lots\t of\nwhitespace\r\n ";
str = str.simplified();
// str == "lots of whitespace";
返回QString字符串的字符个数
原型 int QString::size() const
用法
QString str = "World";
int n = str.size(); // n == 5
两个QString字符串快速交换值
原型 void QString :: swap(QString&other)
QString a = "123";
QString b = "456";
a.swap(b);
qDebug()<< a <<endl; // "456"
qDebug()<< b <<endl; // "123"
截取QString字符串
截取右边字符串 :QString QString::right(int n) const
截取左边字符串 :QString QString::left(int n) const
范围截取字符串 :QString QString::mid(int position, int n = -1) const
QString str = "123";
QString str1 = str.right(2); //str1 == 23
QString str2 = str.left(2); //str2 == 12
QString str3 = str.mid(0,2); //str3 == 12