Qt--QString
2017-01-16 16:48
309 查看
一、Qt字符串类–QString
QString类是Qt提供的功能十分强大的字符串类,由QtCore共享库实现。标准C++提供了两种字符串:C语言风格的以“\0”字符结尾的字符数组和字符串类String。而QString类提供了了一种Unicode字符串类。QString类内部存储了16bit的QChar字符,每个QChar字符代表一个Unicode4.0字符。Unicode字符集是ASCII和Latin-1字符集的超集,能够表示世界上绝大多数书写系统中的字符。QString类采用隐式共享(implict sharing)来减少对内存的使用和避免没必要的数据复制操作,同时,QString变量中不仅可以包含“\0”,而且我们也不必担心字符串数组要以“\0”结尾,这些QString类都帮我们处理好了。QString类还提供了丰富的操作函数,可以非常方便地进行字符串操作和QString类与其他数据类型的转换。二、QString初始化
Qt官方文档给出了QString变量5种初始化的方式,下面举例3种常用的方式。QString str1 = "Hello World!"; static const QChar str_data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'}; QString str2(str_data, 12); // QString str2(str_data, sizeof(str_data)/2); QString str3; str3.resize(12); str3[0] = QChar('H'); str3[1] = QChar('e'); str3[2] = QChar('l'); str3[3] = QChar('l'); str3[4] = QChar('o'); str3[5] = QChar(' '); str3[6] = QChar('W'); str3[7] = QChar('o'); str3[8] = QChar('r'); str3[9] = QChar('l'); str3[10] = QChar('d'); str3[11] = QChar('!'); qDebug() << str1 << str2 << str3;
Qchar类中没有获得其数组长度的成员函数,但是由于QChar为16bit的Unicode字符,所以可以通过sizeof()/2来获取QChar数组的长度。
三、QString操作
1 组合
QString类提供了很多种组合字符串的方法如下:(1) “+”和“+=”操作符重载
QString str1 = "Hello "; QString str2 = "World!"; QString str3 = str1 + str2; QString str3 = str1 + "World!"; QString str1 += "World!";
需要注意的是,使用”+”和”+=”进行QString连接时,操作数必须至少有一个是QString类,否则无法重载操作符。
(2) append(), prepend(), insert()函数
QString str1 = "Hello "; QString str2 = "World!"; str1.append("World!"); // 在字符串str1最后插入字符串"World!" str2.prepend("Hello "); // 在字符串str2最前面插入字符串"Hello " QString str3 = "World!"; str3.insert(0, str2); // 在字符串str3位置0处插入字符串str2
(3) sprintf()函数
QString str1, str2; str1.sprintf("%s", "Hello "); // str1 = "Hello " str2.sprintf("%s%s", "Hello ", "World!"); // str2 = "Hello World!"
(4) arg()函数
arg()是一个很有意思的函数,它在字符串中用占位符”%n”来代替第n个参数变量,对于某些操作来说非常的方便灵活。”%n”的顺序是可以调换的,但是需要注意的是n的范围是1到99之间。当输入的参数为数值时,还可以设置数值的输出格式。QString str1; str1 = QString("%1%2").arg("Hello ").arg("World!"); // str1 = "Hello World!",其中"%1"被"Hello "代替,而"%2"被“World!”代替
在测试代码的过程中,发现”%2%1”输出”World!Hello “,但是”%1%1”和”%2%2”都是输出”Hello Hello “,”%1%3”输出”Hello World!”,”%1%2%3”输出”Hello World!%3”。查看Qt手册之后,发现原来arg()函数在替换变量的时候,先从前面的字符串中找到最小的占位符(%n),然后用后面的arg()中的第一个变量替换,接下来再从替换完的字符串中查找下一个占位符(%n),以此类推。所以,当字符串为”%2%2”时,查找到最小的是”%2”,则用”Hello “来代替”%2”,再次查找发现还是”%2”,同样用”Hello “来代替”%2”。当占位符”%n”大于后面arg()的变量数量且小于99时,则用最后一个变量来代替”%n”。
2 查询
(1) QString::startsWith(), QString::endsWith(), QString::contains()
QString str1 = "Hello World!"; QString str2 = "Hello"; QString str3 = "World"; str1.startsWith(str2, Qt::CaseSensitive); // 表示字符串str1是否以字符串str2开头,第二个参数表示是否对大小写敏感,默认为大小写敏感,返回值为布尔值 str1.endsWith(str3); // 表示字符串str1是否以字符串str3结尾 str1.contains(str2); // 表示字符串str1是否包含字符串str2
(2) indexOf(), lastIndexOf()
QString str1 = "Hello World!"; str1.indexOf("or", 1, Qt::CaseSensitive); // 表示字符串str1中是否包含字符串"or",从字符串第1个字符开始往后查询,大小写敏感。返回值为int型,查询到则返回下表,查询不到则返回-1 str1.indexOf('O', -1, Qt::CaseInsensitive); // 表示字符串str1是否包含字符'O',-1表示从字符串倒数第1个字符开始往后查询 str1.lastIndexOf('o', Qt::CaseSensitive); // 表示字符串str1是否包含字符'o', 从字符串最后一个字符往前开始查询
(3)正则表达式
通过正则表达式还可以查询QString中是否含有指定的字符。正则表达式不在此展开。以下是一个例程,查询字符串中是否含有非16进制字符,即是否含有除”a-zA-X0-9”之外的字符,实际工程中可能还要排除用户输入的空格和过行字符,所以正则表达式为”*[^a-fA-F0-9 \n]*”。”^”表示取反。QString str1 = "12 34 F1 D8 a9"; QString str2 = "12 q1 23 a1"; QString pattern("*[^a-fA-F0-9 \n]*"); //利用正则表达式限制输入的字符为十六进制字符 QRegExp rx; rx.setPatternSyntax(QRegExp::Wildcard); rx.setPattern(pattern); bool match1 = rx.exactMatch(str1); // match1 = false,因为str1中不包含非法字符 bool match2 = rx.exactMatch(str2); // match2 = true,因为str2中包含非法字符"q" qDebug() << match1 << match2;
3 比较
QString类重载了比较大小的操作符(<,>,<=,>=,==,!=),还提供了compare()函数。QString str1 = "Hello"; QString str2 = "hello"; if(str1 < str1) qDebug() << "str1 < str1"; if(QString::compare(str1, str2, Qt::CaseSensitive) == 0) qDebug() << "str1 = str2"; // 返回值大于0表示str1大于str2,返回值小于0表示str1小于str2,返回值等于0表示str1等于str2。可以设置是否对大小写敏感 if(QString::compare(str1, str2, Qt::CaseInsensitive) == 0) qDebug() << "str1 = str2"; if(str1.compare(str2, Qt::CaseInsensitive) == 0) qDebug() << "str1 = str2"; //QString变量本身也有compare函数,用来比较自身与其他字符串变量的大小。 //注意:compare和比较操作符不仅可以用来比较QString变量间的大小,还可以比较QString变量和其他字符串(如const char*)的大小
4 替代
(1) replace()
函数原型为:QString &replace(int position, int n, const QString &after);
QString &replace(int position, int n, const QChar *pch, int size);
QString &replace(int position, int n, QChar after);
以上三个函数表示从位置position开始的n个字符分别替换为QString、QChar数组和Qchar
QString &replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(QChar before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
以上三个函数分别表示将QString替换为QString、QChar替换为QString和QChar替换为QChar
QString str1 = "Hello Word!"; QString str2 = "World"; str1.replace(6, 4, str2); // str1 = "Hello World!" str1.replace("Word", "World", Qt::CaseSensitive); // str1 = "Hello World!"
(2) toLower(), toUpper()
QString str1 = "hello world!"; QString str2 = str1.toUpper(); // str2 = "HELLO WORLD!" QString str3 = str1.toLower(); // str3 = "hello world!"
5 截取、删除
(1)truncate(int position)
QString str1 = "Hello World!"; str1.truncate(5); // 删除字符串str1第5个字符之后的所有字符,str1 = "Hello"
(2)chop(int n)
QString str1 = "Hello World!"; str1.chop(7); // 删除字符串str1最后7个字符, str1 = "Hello"
(3)left(int n), right(int n), mid(int position, int n)
QString str1 = "Hello World!"; QString str2 = str1.left(5); // str2 = "Hello",取str1左边5个字符 QString str3 = str1.right(6); // str3 = "World!",取str1右边6个字符 QString str4 = str1.mid(6, 5); // str4 = "World",取str1中间5个字符
(4)trimmed(), simplified()
QString str1 = " Hello World! "; QString str2 = str1.trimmed(); // str2 = "Hello World!",删除字符串头尾的空白字符 QString str3 = str1.simplified(); // str3 = "Hello World!",删除字符中头尾的空白字符,且中间连续的空白字符替换为单个空格 // 空白字符包括空格、回车、制表符等
(5)at(int position)
QString str1 = "Hello World!"; QChar ch = str1.at(0); // ch = 'H' QChar ch = str1[0]; // 获取字符串str1第0个字符,也可以用str1[0]获得
(6)remove()
QString str1 = "Hello World!"; str1.remove(5, 7); // str1 = "Hello"。字符串删除第5个字符开始后的7个字符
(7)clear()
清除一个QString对象,使字符串成为空字符串6 获取QString对象字符数length(), size()
QString str1 = "Hello World!"; int n = str1.length(); // n = 12 n = str1.size(); // n = 12
7 QString与其他数据类型间的转换
(1)字符集转换函数
QString提供了以下几种字符集转换函数,返回值分别为const char* 版本的字符串QByteArray:toAscii()、toLatin1()、toUtf8()、toLocal8Bit()。QString内部存在隐式转换,可能导致出现编码错误的const char*,程序中可以通过添加宏定义来关闭这些隐式转换。QT_NO_CAST_FROM_ASCII:禁止C string字面量和指针自动转化为Unicode
QT_RESTRICTED_CAST_FROM_ASCII:允许C字符和字符数组自动转化为Unicode,但是禁止字符指针自动转化为Unicode
QT_NO_CAST_TO_ASCII:禁止QString自动转化为C string
可以在工程pro文件中添加这些预处理符号,例如:
DEFINES += QT_NO_CAST_FROM_ASCII \ QT_NO_CAST_TO_ASCII
(2)QString转换为数值类型
QString提供了QString与各种数值类型的转换函数:toInt, toShort, toLong, toFloat, toDouble, to UInt, toUlong等。其中,toInt、toShort、toLong支持进制设置,当字符串中以”0x”、”0”开头时,需指明转换的进制为16进制和8进制,否则转换失败。toFloat和toDouble支持科学记数法。转换成功时,参数ok为true,转换失败则为falseQString str1 = "12"; QString str2 = "12.1234567"; QString str3 = "1234.56e-02"; QString str4 = "12 34.567"; bool ok; int d = str1.toInt(); // d = 12; int dd = str1.toInt(&ok, 16); // d = 18 double d1 = str2.toDouble(); // d1 = 12.123456 double d2 = str3.toDouble(); // d2 = 12.3456 double d3 = str4.toDouble(&ok); // d3 = 0.0, ok = fasle
QString的toDouble()和toFloat()函数返回值的都是保留6位有效数字。
(3)数值类型转换为QString
QString提供了number函数来将数值类型变量转换为QString。QString::number(long n, int base = 10);
QString::number(uint n, int base = 10);
QString::number(int n, int base = 10);
QString::number(ulong n, int base = 10);
QString::number(qlonglong n, int base = 10);
QString::number(qulonglong n, int base = 10);
QString::number(double n, char format=’g’, int precision = 6);
注意,number()将数值类型转换为QString时,默认为10进制,double转换为QString时,默认精度为6。
int n = 12; double d1 = 12.34567; QString str1 = QString::number(n); // str1 = "12" QString str2 = QString::number(n, 16); // str2 = "c" QString str3 = QString::number(d1); // str3 = "12.3457" QString str4 = QString::number(d1, 'e'); // str4 = "1.234567e+01"。科学记数法 QString str5 = QString::number(d1, 'g', 3); // str5 = "12.3"。精度设置为3 qDebug() << str1 << str2 << str3 << str4 << str5;
(4)QString与char*之间的转换
QString到char*的转换可以先将QString转换为QByteArray,然后再将QByte Array转换为char*,char*到QString的转换可以使用QString的构造函数。QString str = "Hello World!"; QByteArray arr = str.toLocal8Bit(); // QString转换为QByteArray char* ch_arr = arr.data(); // QByteArray转换为char* QString str1 = QString(ch_arr); // char*转换为QString qDebug() << arr << ch_arr << str1;
(5)QString与QByteArray之间的转换
前面说到字符集转换函数toLatin1()、toUtf8()、toLocal8Bit()返回QByteArray类型,所以可以通过这些函数完成QString到QByteArray的转换。QString str = "Hello World!"; QByteArray arr = str.toLocal8Bit();
QByteArray到QString的转换直接使用QString的构造函数即可。
QByteArray arr = "Hello World!"; QString str(arr);
本文中的例程均在Qt5.5.0中测试通过。主要参考资料为Qt官网上的文档:
QString Class
QByteArray Class
相关文章推荐
- QT QStringListModel 示例代码
- Qt中Qstring,char,int,QByteArray之间到转换
- Qt下QString转char*
- Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();(转载)
- 【转】Qt中的QString,QByteArray,Qchar, char*
- Qt中QString,char,int,QByteArray之间的转换
- QT中关于QString的一些小结
- Qt 中Enum进行反射来做Enum to QString
- QT系列:控制台输出QString
- Qt中float和Qstring之间的相互转换
- Qt:判断QString中是否有汉字
- Qt中将QString转换为char *或者相反
- QT C++中实现打印QString
- QT:QString、QByteArray和char *的转换。
- Qt 常用类(3)—— QString
- QtInternal 之 高效使用QString
- Qt中 QString 和int,double等的转换
- QT4 中 GDAL 打开 QString 中的字符串路径
- Qt下 QString转char*
- Qt中 QString 和int, char等的“相互”转换