Qt_QString类

来源:互联网 发布:服务器同步软件 v2ex 编辑:程序博客网 时间:2024/06/05 02:53

QString类提供了一个Unicode字符串。

    Header: #include
    qmake: QT += core

Note: All functions in this class are reentrant.

简介

    QString类提供了一个Unicode字符串。
    QString存储一个16位的QChars字符串,每个QChar对应一个Unicode 4.0字符。 (代码值大于65535的Unicode字符使用代理对存储,即两个连续的QChars。)
    Unicode是一种国际标准,支持当今大部分使用的书写系统。它是US-ASCII(ANSI X3.4-1986)和Latin-1(ISO 8859-1)的超集,所有US-ASCII / Latin-1字符都可以在相同的代码位置获得。
    QString使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。这也有助于减少存储16位字符而不是8位字符的固有开销。
    除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位’\ 0’终止的字符串。对于大多数目的,QString是你想要使用的类。它在整个Qt API中都被使用,并且Unicode支持可以确保您的应用程序在某些时候想要扩展应用程序市场时易于翻译。 QByteArray适合的两个主要情况是当你需要存储原始二进制数据,并且当内存保存是关键的时候(比如在嵌入式系统中)。

初始化一个字符串

    一种初始化QString的方法就是将一个const char *传递给它的构造函数。 例如,下面的代码创建一个包含数据“Hello”的大小为5的QString:

QString str = "Hello";

    QString使用fromUtf8()函数将const char *数据转换为Unicode。
    在所有使用const char 参数的QString函数中,const char 被解释为以UTF-8编码的传统C风格的以’\ 0’结尾的字符串。 const char *参数为0是合法的。
    也可以提供字符串数据作为一个QChars数组:

  static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };  QString str(data, 4);

    QString对QChar数据进行了深层次的拷贝,所以您可以稍后对其进行修改而不会产生副作用。 (如果出于性能方面的原因,您不想深入复制字符数据,请改用QString :: fromRawData()。)
    另一种方法是使用resize()来设置字符串的大小,并初始化每个字符的数据字符。 与C ++数组一样,QString使用基于0的索引。 要访问特定索引位置的字符,可以使用operator []()。 在非常量字符串上,运算符[]()返回可以在赋值左侧使用的字符的引用。 例如:

  QString str;  str.resize(4);  str[0] = QChar('U');  str[1] = QChar('n');  str[2] = QChar(0x10e3);  str[3] = QChar(0x03a3);

    对于只读访问,另一种语法是使用at()函数:

  QString str;  for (int i = 0; i < str.size(); ++i) {      if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))          qDebug() << "Found character in range [a-f]";  }

    at()函数可以比operator []()更快,因为它永远不会导致发生深层复制。 或者,使用left(),right()或mid()函数一次提取几个字符。
    一个QString可以嵌入’\ 0’字符(QChar :: Null)。 size()函数总是返回整个字符串的大小,包括嵌入的’\ 0’字符。
    调用resize()函数之后,新分配的字符具有未定义的值。 要将字符串中的所有字符设置为特定值,请使用fill()函数。
    QString提供了许多重载,旨在简化字符串的使用。 例如,如果您想将QString与字符串文字进行比较,则可以这样编写代码,它将按预期工作:

  QString str;  if (str == "auto" || str == "extern"          || str == "static" || str == "register") {      // ...  }

    还可以将字符串文字传递给以QStrings为参数的函数,调用QString(const char )构造函数。 类似的,你可以传递一个QString到一个函数,该函数使用qPrintable()宏来返回给定的QString作为const char 。 这相当于调用 .toLocal8Bit()。constData()。

操纵字符串数据

    QString提供了修改字符数据的以下基本函数:append(),prepend(),insert(),replace()和remove()。 例如:

  QString str = "and";  str.prepend("rock ");     // str == "rock and"  str.append(" roll");        // str == "rock and roll"  str.replace(5, 3, "&");   // str == "rock & roll"

    如果你正在逐步构建一个QString,并且事先知道QString将包含多少个字符,你可以调用reserve(),要求QString预先分配一定的内存。您也可以调用capacity()来查找QString实际分配了多少内存。
    replace()和remove()函数的前两个参数是开始擦除的位置和应该擦除的字符数。如果要将所有出现的特定子字符串替换为另一个子字符串,请使用双参数replace()重载之一。
    通常的要求是从字符串中删除空格字符(’\ n’,’\ t’,”等)。如果你想从QString的两端删除空格,使用trimmed()函数。如果要从两端删除空格,并用字符串中的单个空格字符替换多个连续的空格,请使用simplified()。
    如果要在QString中查找特定字符或子字符串的所有匹配项,请使用indexOf()或lastIndexOf()函数。前者从一个给定的索引位置开始搜索,后者向后搜索。如果找到它们,则返回字符或子字符串的索引位置;否则,他们返回-1。例如,下面是一个典型的循环,它查找所有出现的特定子字符串:

  QString str = "We must be <b>bold</b>, very <b>bold</b>";  int j = 0;  while ((j = str.indexOf("<b>", j)) != -1) {      qDebug() << "Found <b> tag at index position" << j;      ++j;  }

    QString提供了很多功能,可以将数字转换成字符串和字符串。 请参阅arg()函数,setNum()函数,number()静态函数以及toInt(),toDouble()以及类似的函数。
    要得到一个字符串的大写或小写版本,请使用toUpper()或toLower()。
    字符串列表由QStringList类处理。 您可以使用split()函数将字符串拆分为字符串列表,并使用    QStringList :: join()将可选分隔符的字符串列表连接到单个字符串中。 您可以从字符串列表中获取包含特定子字符串的字符串列表,或者使用QStringList :: filter()函数来匹配特定的QRegExp。

查询字符串数据

    如果你想看看一个QString是以一个特定的子字符串开始还是以一个特定的子字符串结束,可以使用startsWith()或endsWith()。 如果你只是想检查一个QString是否包含一个特定的字符或子字符串,使用contains()函数。 如果要查找字符串中出现特定字符或子字符串的次数,请使用count()。
    可以使用运算符<(),运算符<=(),运算符==(),运算符> =()等重载运算符来比较QStrings。 请注意,比较仅基于字符的数字Unicode值。 它速度非常快,但不是人们所期望的; QString :: localeAwareCompare()函数是排序用户界面字符串的更好选择。
    要获得指向实际字符数据的指针,可以调用data()或constData()。 这些函数返回一个指向QChar数据开始的指针。 指针保证保持有效,直到在QString上调用非const函数。
…………………………