您的位置:首页 > 编程语言 > Qt开发

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,转换失败则为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息