QString介绍

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[]数组初始化

Cpp代码  

  1. static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };

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

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

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

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. 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宏所替代。(只需要这一个宏,就可以自动把‘+‘当做‘%‘执行)

时间: 2024-09-29 17:53:34

QString介绍的相关文章

Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)

今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.于是我深入地对这一现象进行了研究.这里先简单介绍一下我的分析过程: FTP服务器在收到List指令后,会把当前文件夹的所有项目(包括文件夹和文件的名称,大小,时间,所有者等相关信息)列举出来并返回给FTP客户端.曾经在网上看到有人说过这样一句话:“ftp 在编码问题上相当笨,笨到对编码一无所知”.确实,多数FTP服务器在返回这些名称时采用的文字编码格式为ANSI.这是一个不太好的

qt model/view 架构基础介绍之QTreeWidget

# -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅助类 # QTreeWidgetItem 一起使用.不过,既然是提供方面的封装类,即便是看上去很复杂的树, # 在使用这个类的时候也是显得比较简单的 __author__ = 'Administrator' from PyQt4.QtGui import  * from PyQt4.Qt impor

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

# -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅助类 # QTreeWidgetItem 一起使用.不过,既然是提供方面的封装类,即便是看上去很复杂的树, # 在使用这个类的时候也是显得比较简单的 __author__ = 'Administrator' from PyQt4.QtGui import  * from PyQt4.Qt impor

qt model/view 架构基础介绍之QListWidget

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from PyQt4.Qt import * from PyQt4 import QtGui, QtCore from PyQt4.QtCore import * import sys # MVC是Model-View-Controller的简写,即模型-视图-控制器 #model/view框架将传统的mv模型分

qt 关于Qt中MVC的介绍与使用

Qt包含一组使用模型/视图结构的类,可以用来管理数据并呈现给用户.这种体系结构引入的分离使开发人员更灵活地定制项目,并且提供了一个标准模型的接口,以允许广泛范围的数据源被使用到到现有的视图中. 模型 - 视图 - 控制器(MVC)是一种设计模式,由三类对象组成:模型:应用程序对象.视图:屏幕演示.控制器:定义了用户界面响应用户输入的方式. 在引入MVC之前,用户界面的设计往往是将这些对象组合在一起.MVC的解耦带来了灵活性和重用性. 如果视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了

第四讲 深入介绍信号与槽

本文概要:讲解Qt的信号与槽机制,涉及信号与槽的连接方法,连接条件等. 可以使用信号与槽机制的类: 信号与槽机制是在QObject类中实现的,这种机制能够用与任何QObject子类中,但是应该在类中加入Q_OBJECT宏. 槽的介绍: 槽与普通的c++成员函数几乎一样:槽能够被声明为虚函数,能被重载,能够被其他函数调用等,与c++普通 的成员函数不同之处仅仅在于槽可以与信号连接在一起,每当发射与槽可以接受的信号时,槽会被自动调用. 槽与信号的连接方法: connect(sender, SIGNA

QString向char* 、string转化

在使用QT时,经常会进行QString.const char*.string之间的相互转化.我通常的做法是使用QString的成员函数完成向string.char*的转化,如: 1 //qstr为QString类型 2 3 string str=qstr.toStdString(); 4 char* pch=qstr.toStdString().c_str(); 但是,在不同的机器上,上述代码可能会导致程序崩溃.究其原因,是由于QString的toStdString()函数的不稳定所致.所以尽量

QT——1、介绍

参考书:<QtCreator快速入门>第2版 1.QT简介 Qt是一个跨平台应用程序和UI开发框架.使用Qt只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序.Qt Software 的前身为创始于1994年的Trolltech(奇趣科技),Trolltech于2008年6月被 Nokia 收购,加速了其跨平台开发战略. Qt是一个基于C++的GUI(Graphical User Interface,又称图形用户接口)库,因为Qt十分庞大,并不仅仅是GU

QString::QString 中文乱码

QString::QString 中文乱码 处理方法: 1. QString str = QString::fromLocal8Bit("中文"); // vs2008 vs2005 2. QString str = QString::fromLocal8Bit("中文"); //  gcc vs2003, 如源码是 GBK 编码(记事本中的 ANSI 编码) 3.QString str = QString::fromUtf8("中文");