QString简介

来源:互联网 发布:南京大学网络教育官网 编辑:程序博客网 时间:2024/06/06 13:07

一、初始化QString字符串


1)Char * 初始化


QString str = "Hello";


QString converts the const char * data into Unicode using the fromAscii() function.


2)QChar[]数组初始化


Cpp代码
  1. static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
  2. QString str(data, 4);
static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 }; QString str(data, 4);


也可以这样


Cpp代码
  1. QRegExp pattern;
  2. static const QChar unicode[] = { 0x005A, 0x007F, 0x00A4, 0x0060,
  3. 0x1009, 0x0020, 0x0020};
  4. int size = sizeof(unicode) /sizeof(QChar);
  5. QString str = QString::fromRawData(unicode, size);
QRegExp pattern; static const QChar unicode[] = { 0x005A, 0x007F, 0x00A4, 0x0060, 0x1009, 0x0020, 0x0020}; int size = sizeof(unicode) / sizeof(QChar); QString str = QString::fromRawData(unicode, size);


3)还可以通过risize()函数和每个QChar字符进行初始化


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


通过at()函数进行每个字符读取


Cpp代码
  1. QString str;
  2. for (int i = 0; i < str.size(); ++i) {
  3. if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))
  4. qDebug() << "Found character in range [a-f]";
  5. }
 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]"; }


二、QString的操作函数 后续慢慢更新


Cpp代码
  1. QString str = "and";
  2. str.prepend("rock "); // str == "rock and"
  3. str.append(" roll"); // str == "rock and roll"
  4. str.replace(5, 3, "&"); // str == "rock & roll"
  5.  
  6. QString x = "free";
  7. QString y = "dom";
  8. x.append(y); // x == "freedom"
  9. x.insert(x.size(), y);//x == "freedom"
  10.  
  11. QString str = "Meal";
  12. str.insert(1, QString("ontr"));
  13. // str == "Montreal"
  14.  
  15. QString s = "Montreal";
  16. s.remove(1, 4); // s == "Meal" 移除1-4字符
  17.  
  18. QString str("LOGOUT\r\n");
  19. str.chop(2); // str == "LOGOUT" 从字符串后面移除2字符
  20.  
  21. QString str = "Vladivostok";
  22. str.truncate(4); // str == "Vlad" 到4截断字符
  23.  
  24. QString s = "Hello world";
  25. s.resize(5); // s == "Hello"
  26. s.resize(8); // s == "Hello???" (where ? stands for any character)
  27.  
  28. QString t = "Hello";
  29. t += QString(10, 'X');
  30. // t == "HelloXXXXXXXXXX"
  31.  
  32. QString r = "Hello";
  33. r = r.leftJustified(10, ' ');
  34. // r == "Hello "
  35.  
  36. QString x = "Pineapple";
  37. QString y = x.left(4); // y == "Pine"
  38.  
  39. QString x = "Pineapple";
  40. QString y = x.right(5); // y == "apple"
  41.  
  42. QString str = "Pineapple";
  43. str = str.rightJustified(5, '.', true);// str == "Pinea"
  44.  
  45. QString str = "Bananas";
  46. str.endsWith("anas"); // returns true
  47. str.endsWith("pple"); // returns false
  48.  
  49. QString str = "Berlin";
  50. str.fill('z');
  51. // str == "zzzzzz"
  52.  
  53. str.fill('A', 2);
  54. // str == "AA"
  55.  
  56. QString x = "sticky question";
  57. QString y = "sti";
  58. x.indexOf(y); // returns 0
  59. x.indexOf(y, 1); // returns 10
  60. x.indexOf(y, 10); // returns 10
  61. x.indexOf(y, 11); // returns -1
  62.  
  63. QString x = "crazy azimuths";
  64. QString y = "az";
  65. x.lastIndexOf(y); // returns 6
  66. x.lastIndexOf(y, 6); // returns 6
  67. x.lastIndexOf(y, 5); // returns 2
  68. x.lastIndexOf(y, 1); // returns -1
  69.  
  70.  
  71. QString x = "Nine pineapples";
  72. QString y = x.mid(5, 4); // y == "pine"
  73. QString z = x.mid(5); // z == "pineapples"
  74.  
  75.  
  76. long a = 63;
  77. QString s = QString::number(a, 16); // s == "3f"
  78. QString t = QString::number(a, 16).toUpper(); // t == "3F"
  79.  
  80. QString s = "Montreal";
  81. s.remove(1, 4);
  82. // s == "Meal"
  83.  
  84. QString t = "Ali Baba";
  85. t.remove(QChar('a'), Qt::CaseInsensitive);
  86. // t == "li Bb"
  87.  
  88. QString x = "Say yes!";
  89. QString y = "no";
  90. x.replace(4, 3, y);
  91. // x == "Say no!"
  92.  
  93. QString str = "colour behaviour flavour neighbour";
  94. str.replace(QString("ou"), QString("o"));
  95. // str == "color behavior flavor neighbor"
  96.  
  97. QString str;
  98. //! [51]
  99. QString csv = "forename,middlename,surname,phone";
  100. QString path = "/usr/local/bin/myapp"; // First field is empty
  101. QString::SectionFlag flag = QString::SectionSkipEmpty;
  102.  
  103. str = csv.section(',', 2, 2); // str == "surname"
  104. str = path.section('/', 3, 4); // str == "bin/myapp"
  105. str = path.section('/', 3, 3, flag); // str == "myapp"
  106.  
  107. //字符串转换成整型
  108. QString str;
  109. str.setNum(1234); // str == "1234"
  110. //字符串转成整型
  111. long a = 63;
  112. QString s = QString::number(a, 16); // s == "3f"
  113. QString t = QString::number(a, 16).toUpper(); // t == "3F"
  114.  
  115. QString str = "a,,b,c";
  116. QStringList list1 = str.split(",");
  117. // list1: [ "a", "", "b", "c" ]
  118. QStringList list2 = str.split(",", QString::SkipEmptyParts);
  119. // list2: [ "a", "b", "c" ]
  120.  
  121.  
  122. QString str = " lots\t of\nwhitespace\r\n ";
  123. str = str.trimmed();
  124. // str == "lots\t of\nwhitespace"
  125.  
  126. //判断字符串相等
  127. int x = QString::compare("aUtO","AuTo", Qt::CaseInsensitive); // x == 0
  128. int y = QString::compare("auto","Car", Qt::CaseSensitive); // y > 0
  129. int z = QString::compare("auto","Car", Qt::CaseInsensitive); // z < 0
  130.  
  131.  
  132. Qstring 转换char*问题!
  133. 方法一:
  134. QString qstr("hello,word");
  135. const char * p = qstr.toLocal8Bit().data();
  136. 方法二:
  137. const char *p = qstr.toStdString().data();
  138. //转换过来的是常量
  139.  
  140. 方法三:
  141. QString str="abc";
  142. char *ch;
  143. QByteArray ba = str.toLatin1()
  144. ch = ba.data();
      


三、更有效的构造 String


我们通常通过"+"连接多个子字符串,例如:


QString foo;


QString type = "long";


foo->setText(QLatin1String("vector<") + type + QLatin1String(">::iterator"));


if (foo.startsWith("(" + type + ") 0x"))


...


这种构造写法,没有任何错误,但是有一些隐藏的效率问题。从Qt4.6之后,我们就可以消除这些问题。


首先,多次使用"+"意味着多次进行内存分配。当你连接n个子字符串的时候,如果n>2,就会有n-1次内存分配。


其次,QLatin1String 并不在内存中保存它的长度,而是当你需要知道它的长度时候,直接调用qstrlen()函数。


在Qt4.6中,新建了一个内部模板类QStringBuilder ,它有一些可以帮助解决该问题的方法。这个类被当做内部的,并不出现在我们的帮助文档中,因为你的代码中并不会用到它。它的使用将会自动的,下面详细说一下。


QStringBuilder 使用表达式模板重新解释'%'操作符,这样当你使用'%'代替'+'符号,连接字符串的时候,多次连接子字符串将被推迟,直到最后整个字符串被确定。这个时候,这个字符串的大小就是已知的了。这个时候内存分配器,就会一次性的分配这个已知大小的空间,然后把各个子字符串一个个拷贝进来。


QLatin1Literal 是一个二级的内部类,它可以代替QLatin1String类。QLatin1String类因为兼容性的原因无法被改变。QLatin1Literal 存储了它的长度,因此当QStringBuilder 计算最后的字符串的大小时,可以节省时间。


另外还通过内联潜入和减少引用次数(通过QStringBuilder 创立的QString,引用数是1,而QString::append()需要额外的测试)提高效率。


有三种方式,可以使用这种改善string构造效率的方法。


直接方式就是包含QStringBuilder ,当你在任何地方用到它的时候。然后当连接字符串的时候,用'%'代替'+'。


#include <QStringBuilder>


QString hello("hello");


QStringRef el(&hello, 2, 3);


QLatin1String world("world");


QString message = hello % el % world % QChar('!');


另外一种:全局的方式,定义一个宏定义。然后用用'%'代替'+'


//使用快速连接


#define QT_USE_FAST_CONCATENATION


and use '%' instead of '+' for string concatenation everywhere.


第三种方式:最方便,但是并不是所有代码都会兼容。就是包含两个宏定义即可。


#define QT_USE_FAST_CONCATENATION


#define QT_USE_FAST_OPERATOR_PLUS


然后所有的'+'就会被当做QStringBuilder 的'%'执行。


但在Qt 4.8、5.0,这个宏已被新的QT_USE_QSTRINGBUILDER宏所替代。(只需要这一个宏,就可以自动把'+'当做'%'执行)


0 0
原创粉丝点击