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[]数组初始化
- static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
- QString str(data, 4);
也可以这样
- 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字符进行初始化
- 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]";
- }
二、QString的操作函数 后续慢慢更新
- QString str = "and";
- str.prepend("rock "); // str == "rock and"
- str.append(" roll"); // str == "rock and roll"
- str.replace(5, 3, "&"); // str == "rock & roll"
- QString x = "free";
- QString y = "dom";
- x.append(y); // x == "freedom"
- x.insert(x.size(), y);//x == "freedom"
- QString str = "Meal";
- str.insert(1, QString("ontr"));
- // str == "Montreal"
- QString s = "Montreal";
- s.remove(1, 4); // s == "Meal" 移除1-4字符
- QString str("LOGOUT\r\n");
- str.chop(2); // str == "LOGOUT" 从字符串后面移除2字符
- QString str = "Vladivostok";
- str.truncate(4); // str == "Vlad" 到4截断字符
- QString s = "Hello world";
- s.resize(5); // s == "Hello"
- s.resize(8); // s == "Hello???" (where ? stands for any character)
- QString t = "Hello";
- t += QString(10, 'X');
- // t == "HelloXXXXXXXXXX"
- QString r = "Hello";
- r = r.leftJustified(10, ' ');
- // r == "Hello "
- QString x = "Pineapple";
- QString y = x.left(4); // y == "Pine"
- QString x = "Pineapple";
- QString y = x.right(5); // y == "apple"
- QString str = "Pineapple";
- str = str.rightJustified(5, '.', true); // str == "Pinea"
- QString str = "Bananas";
- str.endsWith("anas"); // returns true
- str.endsWith("pple"); // returns false
- QString str = "Berlin";
- str.fill('z');
- // str == "zzzzzz"
- str.fill('A', 2);
- // str == "AA"
- QString x = "sticky question";
- QString y = "sti";
- x.indexOf(y); // returns 0
- x.indexOf(y, 1); // returns 10
- x.indexOf(y, 10); // returns 10
- x.indexOf(y, 11); // returns -1
- QString x = "crazy azimuths";
- QString y = "az";
- x.lastIndexOf(y); // returns 6
- x.lastIndexOf(y, 6); // returns 6
- x.lastIndexOf(y, 5); // returns 2
- x.lastIndexOf(y, 1); // returns -1
- QString x = "Nine pineapples";
- QString y = x.mid(5, 4); // y == "pine"
- QString z = x.mid(5); // z == "pineapples"
- long a = 63;
- QString s = QString::number(a, 16); // s == "3f"
- QString t = QString::number(a, 16).toUpper(); // t == "3F"
- QString s = "Montreal";
- s.remove(1, 4);
- // s == "Meal"
- QString t = "Ali Baba";
- t.remove(QChar('a'), Qt::CaseInsensitive);
- // t == "li Bb"
- QString x = "Say yes!";
- QString y = "no";
- x.replace(4, 3, y);
- // x == "Say no!"
- QString str = "colour behaviour flavour neighbour";
- str.replace(QString("ou"), QString("o"));
- // str == "color behavior flavor neighbor"
- QString str;
- //! [51]
- QString csv = "forename,middlename,surname,phone";
- QString path = "/usr/local/bin/myapp"; // First field is empty
- QString::SectionFlag flag = QString::SectionSkipEmpty;
- str = csv.section(',', 2, 2); // str == "surname"
- str = path.section('/', 3, 4); // str == "bin/myapp"
- str = path.section('/', 3, 3, flag); // str == "myapp"
- //字符串转换成整型
- QString str;
- str.setNum(1234); // str == "1234"
- //字符串转成整型
- long a = 63;
- QString s = QString::number(a, 16); // s == "3f"
- QString t = QString::number(a, 16).toUpper(); // t == "3F"
- QString str = "a,,b,c";
- QStringList list1 = str.split(",");
- // list1: [ "a", "", "b", "c" ]
- QStringList list2 = str.split(",", QString::SkipEmptyParts);
- // list2: [ "a", "b", "c" ]
- QString str = " lots\t of\nwhitespace\r\n ";
- str = str.trimmed();
- // str == "lots\t of\nwhitespace"
- //判断字符串相等
- int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive); // x == 0
- int y = QString::compare("auto", "Car", Qt::CaseSensitive); // y > 0
- int z = QString::compare("auto", "Car", Qt::CaseInsensitive); // z < 0
- Qstring 转换char*问题!
- 方法一:
- QString qstr("hello,word");
- const char * p = qstr.toLocal8Bit().data();
- 方法二:
- const char *p = qstr.toStdString().data();
- //转换过来的是常量
- 方法三:
- QString str="abc";
- char *ch;
- QByteArray ba = str.toLatin1()
- 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介绍的更多相关文章
- [转载]QString 乱谈(3)-Qt5与中文
原文地址http://blog.csdn.net/dbzhang800/article/details/7542672?reload 两个月前,简单写过QTextCodec中的setCodecForT ...
- Qt Assistant介绍
简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...
- 【Qt】Qt Assistant介绍【转】
简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...
- 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...
- qt model/view 架构基础介绍之QTableWidget
# -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- 《Qt on Android核心编程》介绍
<Qt on Android核心编程>最终尘埃落定.付梓印刷了. 2014-11-02更新:china-pub的预售链接出来了.折扣非常低哦. 封面 看看封面的效果吧,历经几版,最终就成了 ...
- 28.QT-QPainter介绍
介绍 可以在QPaintDevice类上绘制各种图形 QPaintDevice类表示QPainter的绘图设备(画布) QpaintDevice子类有QImage.QOpenGLPaintDevice ...
- 界面编程之QT的基本介绍与使用20180722
/*******************************************************************************************/ 一.qt介绍 ...
随机推荐
- java中long类型转换为int类型
由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 [java] l ...
- 红黑树和AVL树
在此之前,我没有了解过红黑树以及AVL tree,真是孤陋寡闻.如果你也在学习的话,我们一起进步. 如果,你很急,那么只看红色加粗即可. 1.红黑树(RB-tree) 红黑树是一种特殊的二叉搜索树,特 ...
- composer安装学习
Packagist 镜像 网站地址 http://www.phpcomposer.com/ 请各位使用本镜像的同学注意: 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 http ...
- 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 ...
- CAFFE(FAQ.2):Ubuntu 配置caffe 框架之数据库读取,错误解决:ImportError: No module named leveldb解决办法
Z: 在安装了caffe框架后需要读取大量的数据进行学习训练.比如在MNIST识别训练中,一般直接读图片会比较耗时,我们一般将图片转存为数据库中.目前主流的数据库有以下两种选择: LevelDB Lm ...
- 异步处理的框架Sanic的使用方法和小技巧
Sanic是异步处理的框架,运用Sanic可以开发快速异步响应的web程序.想必大家看到这个都会比较期待和兴奋. 那么如何使用Sanic来实现快速响应呢?我们先来看一看Sanic的基本介绍. Sani ...
- D. Connected Components Croc Champ 2013 - Round 1 (并查集+技巧)
292D - Connected Components D. Connected Components time limit per test 2 seconds memory limit per t ...
- Python&Selenium&pytest借助allure生成自动化测试报告
一.摘要 本篇博文将介绍Python和Selenium进行自动化测试时,如何借助allure生成自动化测试报告 二.环境配置 首先python环境中安装pytest和pytest_allure_ada ...
- 如何使用NugetPackageExplorer 创建Nuget发布包,简易版
在上一篇博客中,详细介绍了个人Nuget服务器的搭建.这篇博客中,将详细介绍一下如何使用NugetPackageExplorer工具制作可以发布到Nuget服务器上包. 直奔主题 在开始之前,需要下载 ...
- 巧用 Img / JavaScript 采集页面数据
摘要: 当我们有一个新内容时(例如新功能.新活动.新游戏.新文章),作为运营人员总是迫不及待地希望能尽快传达到用户,因为这是获取用户的第一步.也是最重要的一步. 点此查看原文:http://click ...