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的主要内容,如果未能解决你的问题,请参考以下文章

Qt QString 和 LPCWSTR 的相互转换

QT QString

Qt QString 与 QByteArray 的转换

QT QString

Qt QString 包含某类型

QT QString转char*,char*转QString;简单明了,看代码。