Qt--QString
Posted herr_edoc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt--QString相关的知识,希望对你有一定的参考价值。
一、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,转换失败则为false
QString 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--QString的主要内容,如果未能解决你的问题,请参考以下文章