所有的QString的方法都使用const char *参数,const char *被解释为经典的C风格的以零结尾的ASCII字符串。所以const char *参数为0是合法的。如果const char *不是以零结尾的,结果是不确定的。把经典的C字符串复制到QString的函数将不会复制结尾的0字符。QString的QChar数组(可以通过unicode()返回)通常不以零结尾。如果你需要把QString传递到一个需要C的以零结尾的字符串,请使用latin1()。
QString::null是一个零QString。当排序的时候,空字符串在最前面,然后是非空字符串,然后才是零字符串。我们建议使用if ( !str.isNull() ),而不是if ( !str )来检测非零字符串,关于解释说明也可以参考operator!()。
注意如果你发现你正在混合使用QCString、QString和QByteArray,这将会导致很多不必要的复制并且也许会预示着你正在处理的真实自然数据是不确定的。如果数据是以零结尾的八位数据,请使用QCString;如果它是没有结尾的(也就是包含0)八位数据,请使用QByteArray;如果它是文本,请使用QString。
字符串列表可以使用QStringList类来处理。你可以使用QStringList::split()来把一个字符串分割为一个字符串列表,并且可以使用QStringList::join()把一个字符串列表连接成一个使用随意间隔符的字符串。你也可以使用QStringList::grep()从一个字符串列表中获得包含特定子字符串或者包含匹配特定的regex的字符串列表。
C程序员的注意事项
由于C++的类型系统和QString是隐含共享的事实,QString也许会被看做整型或者其它简单基本类型。例如:
QString boolToString( bool b ) { QString result; if ( b ) result = "True"; else result = "False"; return result; }
变量result是一个分配在栈中的自动变量。当return被调用时,因为我们正在返回值,复制构造函数被调用并且这个字符串的一个复制被返回。(我们要感谢隐含共享,没有实际的复制发生,请看下面。)
在Qt的源代码中,你将会遇到想这样的QString的用法:
QString func( const QString& input ) { QString output = input; // 处理输出 return output; }
从input到output的“复制”几乎和复制指针一样快,因为后面的场景复制是通过增加引用计数器来实现的。QString操作是基于写时复制的,只有在实例发生实际改变时,才会被复制。
如果你想不丢失任何Unicode信息的情况下创建一个QString的深度复制,那么你应该使用QString中用QChar*作为参数的构造函数。例如:
QString a("abcd"); QString b( a.unicode(), b.length() );
另外,使用QString中用const char*参数的构造函数就足够了。例如:
QString a("abcd"); QString b( a.latin1() );
也可以参考QChar、QCString、QByteArray、QConstString、隐含和明显共享类、文本相关类和非图形用户界面类。
成员类型文档
section()。
成员函数文档
isNull()。
QChar ch )
构造一个长度为一个字符,内容为给定字符ch的字符串。
QString & s )
构造一个s的隐含共享的复制。这是短时间的,因为引用计数被使用。
QByteArray & ba )
构造一个被解释为经典C字符串的ba的深度复制的字符串。
QChar * unicode, uint length )
构造一个QChar数组中开始length个字符的深度复制的字符串。
如果unicode和length为0,那么一个零字符串被创建。
如果只是unicode为0,字符串为空,但是被分配为length个字符空间——无论如何QString可以自动扩展,但是这也许会在一些情况下提高速度。我们建议根据这个目的使用简单的构造函数和setLength(),因为它的结果是有更多的可读代码。
深度复制的字符串。
如果str,那么一个零字符串被创建。
这是一个抛出构造函数,但是它是完全安全的:把一个Latin1的const char*转化到QString保存了所有的信息。当你编译你的应用程序时,你可以通过定义QT_NO_CAST_ASCII来关闭这个构造函数。你可以使用setLatin1()、fromLatin1()、fromLocal8Bit()和fromUtf8()来生成QString。或者无论什么适合你的八位数据的编码方式。
也可以参考isNull()。
把str添加到字符串中并且返回结果的引用。
string = "Test"; string.append( "ing" ); // string == "Testing"
等于operator+=()。
QString & operator+=()。
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
把字符ch添加到字符串中并且返回结果的引用。
等于operator+=()。
QString QString & a, int fieldwidth = 0 ) const
这个函数将返回使用a来替换最低层出现的%i(i为'1'或'2'或……'9')的字符串。
fieldwidth值指定了填充到a中的最小空间。正值将产生右对齐文本,负值将产生左对齐文本。
QString firstName( "Joe" ); QString lastName( "Bloggs" ); QString fullName; fullName = QString( "First name is '%1', last name is '%2'" ) .arg( firstName ) .arg( lastName ); // fullName == First name is 'Joe', last name is 'Bloggs'
警告:如果你是用arg()来构造一个想上面实例中的“真正”的句子,那么这可能导致一些翻译的问题(当你使用tr()函数时)。
如果没有%i模式,一个警告信息(qWarning())被输出并且这个文本被添加到字符串的末尾。这被做为错误恢复的功能并且不应该在正确的代码中出现。
也可以参考QObject::tr()。
QString QString( "Decimal 63 is %1 in hexadecimal" ) .arg( 63, 0, 16 ); // str == "Decimal 63 is 3f in hexadecimal"
QString QString QString QString QString QString QString QChar a, int fieldwidth = 0 ) const
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
QString QString( "'E' format, precision 3, gives %1" ) .arg( d, 0, 'E', 3 ); // ds == "1.234E+001"
const char * latin1()并且返回结果。
实例:network/networkprotocol/nntp.cpp。
QChar QChar ch = string.at( 4 ); // ch == 'e'
如果QString不是常量(也就是const QString)或者const&(也就是const QString&),那么at()的非常量重载将被用来替代。
QCharRef QString & s1, const QString & s2 ) [静态]
对s1和s2进行词典比较,如果s1小于、等于或者大于s2,就返回小于、等于或者大于0的整数。
这个比较是专有的基于字符的数字Unicode值并且非常快,但是不是人们所期待的。排序用户界面字符串请考虑使用QString::localeAwareCompare()。
int a = QString::compare( "def", "abc" ); // a > 0 int b = QString::compare( "abc", "def" ); // b < 0 int c = QString::compare(" abc", "abc" ); // c == 0
int QString & s ) const
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
对这个字符串和s进行词典比较,如果它小于、等于或者大于s,就返回小于、等于或者大于0的整数。
void QChar(0x0041)('A')和QChar(0x0308)(Unicode accent diaresis),给定的QChar(0x00c4)(德语的A元音变音)。
等于at(i)。
也可以参考ref()。
int QChar c, bool cs = TRUE ) const
返回在这个字符串中字符c出现的次数。
如果cs为真,那么匹配是区分大小写的。如果cs为假