QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character.

一、初始化QString字符串

1)Char * 初始化

QString str = "Hello";

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

2)QChar[]数组初始化

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

也可以这样

  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);

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

  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);

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

  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的操作函数  后续慢慢更新

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

QString介绍的更多相关文章

  1. [转载]QString 乱谈(3)-Qt5与中文

    原文地址http://blog.csdn.net/dbzhang800/article/details/7542672?reload 两个月前,简单写过QTextCodec中的setCodecForT ...

  2. Qt Assistant介绍

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  3. 【Qt】Qt Assistant介绍【转】

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  4. 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。

    在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...

  5. qt model/view 架构基础介绍之QTableWidget

    # -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...

  6. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  7. 《Qt on Android核心编程》介绍

    <Qt on Android核心编程>最终尘埃落定.付梓印刷了. 2014-11-02更新:china-pub的预售链接出来了.折扣非常低哦. 封面 看看封面的效果吧,历经几版,最终就成了 ...

  8. 28.QT-QPainter介绍

    介绍 可以在QPaintDevice类上绘制各种图形 QPaintDevice类表示QPainter的绘图设备(画布) QpaintDevice子类有QImage.QOpenGLPaintDevice ...

  9. 界面编程之QT的基本介绍与使用20180722

    /*******************************************************************************************/ 一.qt介绍 ...

随机推荐

  1. java中long类型转换为int类型

    由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 [java] l ...

  2. 红黑树和AVL树

    在此之前,我没有了解过红黑树以及AVL tree,真是孤陋寡闻.如果你也在学习的话,我们一起进步. 如果,你很急,那么只看红色加粗即可. 1.红黑树(RB-tree) 红黑树是一种特殊的二叉搜索树,特 ...

  3. composer安装学习

    Packagist 镜像 网站地址 http://www.phpcomposer.com/ 请各位使用本镜像的同学注意: 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 http ...

  4. CHD-5.3.6集群上Flume的文件监控

    收集hive的log     hive的运行日志:    /home/hadoop/CDH5.3.6/hive-0.13.1-cdh5.3.6/log/hive.log * memory *hdfs  ...

  5. CAFFE(FAQ.2):Ubuntu 配置caffe 框架之数据库读取,错误解决:ImportError: No module named leveldb解决办法

    Z: 在安装了caffe框架后需要读取大量的数据进行学习训练.比如在MNIST识别训练中,一般直接读图片会比较耗时,我们一般将图片转存为数据库中.目前主流的数据库有以下两种选择: LevelDB Lm ...

  6. 异步处理的框架Sanic的使用方法和小技巧

    Sanic是异步处理的框架,运用Sanic可以开发快速异步响应的web程序.想必大家看到这个都会比较期待和兴奋. 那么如何使用Sanic来实现快速响应呢?我们先来看一看Sanic的基本介绍. Sani ...

  7. D. Connected Components Croc Champ 2013 - Round 1 (并查集+技巧)

    292D - Connected Components D. Connected Components time limit per test 2 seconds memory limit per t ...

  8. Python&Selenium&pytest借助allure生成自动化测试报告

    一.摘要 本篇博文将介绍Python和Selenium进行自动化测试时,如何借助allure生成自动化测试报告 二.环境配置 首先python环境中安装pytest和pytest_allure_ada ...

  9. 如何使用NugetPackageExplorer 创建Nuget发布包,简易版

    在上一篇博客中,详细介绍了个人Nuget服务器的搭建.这篇博客中,将详细介绍一下如何使用NugetPackageExplorer工具制作可以发布到Nuget服务器上包. 直奔主题 在开始之前,需要下载 ...

  10. 巧用 Img / JavaScript 采集页面数据

    摘要: 当我们有一个新内容时(例如新功能.新活动.新游戏.新文章),作为运营人员总是迫不及待地希望能尽快传达到用户,因为这是获取用户的第一步.也是最重要的一步. 点此查看原文:http://click ...