1 字符串类

1.1 操作字符串

字符串有如下几个操作符。
(1)QString提供了一个二元的“+”操作符用于组合两个字符串,并提供了一个“+=”操作符用于将一个字符串追加到另一个字符串的末尾,例如:
QString str1 = "Welcome "; str1=str1+"to you! "; //str1=" Welcome to you! "
QString str2 = "Hello,"; str2+="World! "; //str2="Hello,World! "
(2)QString::append()函数具有与“+=”操作符同样的功能,实现在一个字符串的末尾追加另一个字符串,例如:
QString str1 = "Welcome ";
QString str2 = "to ";
str1.append(str2); //str1=" Welcome to"
str1.append("you! "); //str1="Welcome to you! "
(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样。例如:
QString str;
str.sprintf("%s"," Welcome "); //str="Welcome "
str.sprintf("%s"," to you! "); //str="to you! "
str.sprintf("%s %s"," Welcome ","to you! "); //str=" Welcome to you! "
(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点数精度进行控制。通常,相对于函数QString::sprintf(),函数QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变"%n"参数的顺序。例如:
QString str;
str=QString("%1 was born in %2.").arg("John").arg(1982); //str="John was born in 1982."
(5)QString也提供了一些其他组合字符串的方法,包括如下几种。
① insert()函数:在原字符串特定的位置插入另一个字符串;
② prepend()函数:在原字符串的开头插入另一个字符串;
③ replace()函数:用指定的字符串代替原字符串中的某些字符。
(6)很多时候去掉一个字符串两端的空白(空白字符包括回车字符“\n”、换行字符“\r”、制表符“\t”和空格字符“ ”等)非常有用,如获取用户输入的账号时。
① QString::trimmed()函数:移除字符串两端的空白字符;
② QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符“ ”代替字符串中出现的空白字符。
例如:
QString str=" Welcome \t to \n you! ";
str=str.trimmed(); //str=" Welcome \t to \n you! "

1.2 查询字符串数据

(1)函数QString::startsWith()判断一个字符串是否以某个字符串开头。此函数具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏感的),例如:
QString str="Welcome to you! ";
str.startsWith("Welcome",Qt::CaseSensitive); //返回true;
str.startsWith("you",Qt::CaseSensitive); //返回false;
(2)函数QString::endsWith()类似于QString::startsWith(),此函数判断一个字符串是否以某个字符串结尾。
(3)函数QString::contains()判断一个指定的字符串是否出现过,例如:
QString str=" Welcome to you! ";
str.contains("Welcome",Qt::CaseSensitive); //返回true
(4)比较两个字符串也是经常使用的功能,QString提供了多种比较手段。
① operator<(const QString&):比较一个字符串是否小于另一个字符串,如果是,则返回true;
② operator<=(const QString&):比较一个字符串是否小于等于另一个字符串,如果是,则返回true;
③ operator==(const QString&):比较两个字符串是否相等,如果相等,则返回true;
④ operator>=(const QString&):比较一个字符串是否大于等于另一个字符串,如果是,则返回true;
⑤ localeAwareCompare(const QString&,const QString&):静态函数,比较前后两个字符串,如果小于则返回负整数值;如果等于则返回0;如果大于则返回正整数值。;
⑥ compare(const QString&,const QString&,Qt::CaseSensitivity):该函数可以指定是否进行大小写的比较,而大小写的比较是完全基于字符的Unicode编码值的,而且是非常快的,返回值类似于localeAwareCompare()函数。

1.3 字符串的转换

(1)QString::toInt()函数将字符串转换为整型数值,类似的函数还有todouble()、toFloat()、toLong()、toLongLong()等。下面举个例子说明其用法:
QString str="125";
bool ok;
int hex=str.toInt(&ok,16); //ok=true,hex=293
int dec=str.toInt(&ok,10); //ok=true,dec=125
(2)QString提供的字符编码集的转换函数将会返回一个const char*类型版本的QByteArray,即构造函数QByteArray(const char*)构造的QByteArray对象。QByteArray类具有一个字节数组,它既可以存储原始字节(raw bytes),也可以存储传统的以“\0”结尾的8位的字符串。在Qt中,使用QByteArray比使用const char*更方便,且QByteArray也支持隐式共享。转换函数有以下几种。
① toAscii():返回一个ASCII编码的8位字符串。;
② tolatin1():返回一个Latin-1(ISO8859-1)编码的8位字符串;
③ toUtf8():返回一个UTF-8编码的8位字符串(UTF-8是ASCII码的超级,它支持整个Unicode字符集);
④ toLocal8Bit():返回一个系统本地(locale)编码的8位字符串。
下面举例说明其用法:
QString str=" Welcome to you! ";
QByteArray ba=str.toAscii();
qDebug()<<ba;
ba.append("Hello,World! ");
qDebug()<<ba.data();
一个NULL字符串就是使用QString的默认构造函数或者使用“(const char*)0”作为参数的构造函数创建的QString字符串对象;而一个空字符串是一个大小为0的字符串。一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个NULL字符串。例如:
QString().isNull(); //结果为true
QString().isEmpty(); //结果为true
QString("").isNull(); //结果为false
QString("").isEmpty(); //结果为true

2 容器类

2.1 QList类、QLinkedList类和QVector类

2.1.1 QList类

QList<T>是迄今为止最常用的容器类,它存储给定数据类型T的一列数值。
QList不仅提供了可以在列表进行追加的QList::append()和Qlist::prepend()函数,还提供了在列表中间完成插入操作的函数QList::insert()。
QList<T>维护了一个指针数组,该数组存储的指针指向QList<T>存储的列表项的内容。
对于不同的数据类型,QList<T>采取不同的存储策略,存储策略有以下几种。
(1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList<T>会将数值直接存储在它的数组中;
(2)如果QList<T>存储对象的指针,则该指针指向实际存储的对象。
下面举一个例子:
#include <QDebug> int main(int argc,char *argv[])
{
QList<QString> list;
{
QString str("This is a test string");
list<<str;
}
qDebug()<<list[0]<< "How are you! ";
return 0;
}

2.1.2 QLinkedList类

QLinkedList<T>是一个链式列表,它以非连续的内存块保存数据。
QLinkedList<T>不能使用下标,只能使用迭代器访问它的数据项。

2.1.3 QVector类

QVector<T>在相邻的内存中存储给定数据类型T的一组数值。
QVector<T>既可以使用下标访问数据项,也可以使用迭代器访问数据项。

2.1.4 Java风格迭代器遍历容器

Java风格的迭代器是Qt 4新加入的一个功能。
对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型,即只读访问和读写访问,其分类见下表。

2.1.5 STL风格迭代器遍历容器

对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。STL风格迭代器的两种分类见下表。

2.2 QMap类和QHash类

QMap类和QHash类具有非常类似的功能,它们的差别仅在于:
①QHash具有比QMap更快的查找速度;
② QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据;
③ QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供operator<()函数。
二者的时间复杂度比较见下表。

2.2.1 QMap类

QMap<Key,T>提供了一个从类型为Key的键到类型为T的值的映射。

2.2.2 QHash类

QHash<Key,T>具有与QMap几乎完全相同的API。
QHash维护着一张哈希表(Hash Table),哈希表的大小与QHash的数据项的数目相适应。

2.2.3 Java风格迭代器遍历容器

对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。其分类见下表。
下面的例子完成了在QMap中的插入、遍历和修改。
#include <QDebug>
int main(int argc,char *argv[])
{
QMap<QString,QString> map;
map.insert("beijing","111");
map.insert("shanghai","021");
map.insert("nanjing","025");
QMapIterator<QString,QString> i(map);
for( ; i.hasNext( ) ; )
{
qDebug()<<" "<<i.key()<<" "<<i.next().value();
}
QMutableMapIterator<QString,QString> mi(map);
if(mi.findNext("111"))
{
mi.setValue("010");
}
QMapIterator<QString,QString> modi(map);
qDebug()<<" ";
for( ; modi.hasNext() ; )
{
qDebug()<<" "<<modi.key()<<" "<<modi.next().value();
}
return 0;
}

2.2.4 STL风格迭代器遍历容器

对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。其分类见下表。
下面的程序功能与使用Java风格迭代器的例子基本相同。不同的是,这里通过查找键来实现值的修改。
#include <QDebug>
int main(int argc,"021");
map.insert("jinan","0531");
QMap<QString,QString>::const_iterator i;
for(i = map.constBegin(); i != map.constEnd() ; ++i )
{
qDebug()<<" "<<i.key()<<" "<<i.value();
}
QMap<QString,QString>::iterator mi;
mi=map.find("beijing");
if(mi != map.end())
{
mi.value()="010";
}
QMap<QString,QString>::const_iterator modi;
qDebug()<<" ";
for(modi = map.constBegin() ; modi != map.constEnd() ; ++modi )
{
qDebug()<<" "<<modi.key()<<" "<<modi.value();
}
return 0;
}

3 QVariant类

QVariant类类似于C++的联合(union)数据类型,它不仅能够保存许多Qt类型的值,包括QColor、QBrush、QFont、QPen、QRect、QString和QSize等,也能够存放Qt的容器类型的值。Qt的很多功能都是建立在QVariant基础上的,如Qt的对象属性及数据库功能等。

4 算法及正则表达式

4.1 Qt5常用算法

Qt的<QtAlgorithms>和<QtGlobal>模块提供了一些算法和函数,下面简单介绍几个常用算法的用法。
#include <QDebug>
int main(int argc,char *argv[])
{
double a=-19.3,b=9.7;
double c=qAbs(a); //c=19.3
double max=qMax(b,c); //max=c=19.3

int bn=qRound(b); //bn=10
int cn=qRound(c); //cn=19

qDebug()<<"a="<<a;
qDebug()<<"b="<<b;
qDebug()<<"c=qAbs(a)= "<<c;
qDebug()<<"qMax(b,c)= "<<max;
qDebug()<<"bn=qRound(b)= "<<bn;
qDebug()<<"cn=qRound(c)= "<<cn;

qSwap(bn,cn);
qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<" cn="<<cn;
return 0;
}

4.2 基本的正则表达式

正则表达式由表达式(expressions)、量词(quantifiers)和断言(assertions)组成。
(1)最简单的表达式是一个字符。要表示字符集的表达式可以使用如“[AEIoU]”表示匹配所有的大写元音字母;使用“[^AEIoU]”则表示匹配所有非元音字母,即辅音字母;连续的字符集可以使用表达式如“[a-z]”,表示匹配所有小写英文字母;
(2)量词说明表达式出现的次数,如“x[1,2]”表示“x”可以至少有一个,至多两个。 在计算机语言中,标识符通常要求以字母或下画线开头,后面可以是字母、数字和下画线。满足条件的标识符表示为: " [A-Za-z_]+[A-Za-z_0-9]* " 。
类似的正则表达式量词见下表。
(3)“^”、“$”、“\b”都是正则表达式的断言,正则表达式的断言见下表。

Qt工具类的更多相关文章

  1. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  2. ios – Swift:如何从不同的swift文件中调用函数

    我的Xcode6beta-2项目中有多个类型为UIViewController的swift文件.我基本上想知道文件A中的一些数据在文件B中使用.我的文件都是UIViewControllers,我创建了一个没有参数的函数,它返回UIViewController_A中的字符串.当我尝试在UIViewController_B中调用所述函数时,intellisense为我填写,但是我必须有一个自动填充为U

  3. ios – 如何使用SwiftyJSON将字符串转换为JSON

    要转换的字符串:[{“description”:“Hi”,“id”:2,“img”:“hi.png”},{“description”:“pet”,“id”:10,“img”:“pet.png“},{”description“:”Hello!:D“,”id“:12,”img“:”hello.png“}]转换字符串的代码:varjson=JSON该字符串转换为JSON,当我尝试计算这个JSON里面有多少个块时,我得到0.打印控制台输出:0我失踪了什么帮助非常感激.解决方法实际上,在SwifyJSON中有一个内

  4. ios – 将两个字符串转换为一组布尔值的快速方法是什么?

    我有一个长字符串,我想转换为一个布尔值数组.而且它需要很多次,很快.我天真的尝试是这样的:但这比我想要的要慢很多.我的剖析告诉我,地图是减速的地方,但我不知道我能做多么简单.我觉得如果没有Swift’s/ObjC的开销,这样做会很快.在C中,我认为这是一个简单的循环,其中一个字节的内存与一个常量进行比较,但我不知道我应该看的是什么函数或语法.有更好的办法吗?

  5. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 05 Strings and Characters

    Swift所代表的字符串是字符串类型,进而代表字符类型的值的集合//Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。每一个字符值代表一个Unicode字符,我们可以利用for-in循环来遍历字符串中的每一个字符println}//定义一个字符常量letyenSign:Character="$"printlncharacters")//使用"countElements()"函数来获取字符串的长度//8.ConcatenatingStrings

  6. String 与 NSString 的区别

    Swift的String类型与FoundationNsstring类进行了无缝桥接。在日常开发中,绝大多数应该用StringString与Nsstring还有以下区别String类型是值类型,字符串在进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。String可以支持字符遍历Nsstring不支持String是一个结构体,性能更高;Nsstring是一个NSObject对象,性能相对会差现在还有一些功能,用String不

  7. 三 Swift学习之字符串和字符Strings and Characters

    Swift的String和Character类型提供了一个快速的,兼容Unicode的方式来处理代码中的文本信息。更多关于在Foundation和Cocoa中使用String的信息请查看UsingSwiftwithCocoaandObjective-C。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。所以Swift中的字符在一个字符串中并不一定占用相同的内存空间。

  8. Swift语法基础:13 - Swift的字符串字面量, 初始化字符串, 字符串可变性, 字符串是值类型

    在不同情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值。Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确您独有该字符串的值,无论它来自哪里。您可以放心您传递的字符串本身不会被更改,除非是你自己更改它。

  9. Swift语法基础:14 - Swift的字符使用, 计算数量, 连接字符串和字符, 字符串插值, 比较字符串

    如果您正在处理一个长字符串,需要注意countElements函数必须遍历字符串中的字符,以精准计算字符串的长度。Nsstring的length属性是基于利用UTF-16表示的十六位codeunits数目,而不是基于Unicode字符。为了解决这个问题,Nsstring的length属性在被Swift的String值访问时会被称为utf16count。

  10. Swift教程08-基本数据类型(四)String与NSString对比

    Swift给我们提供的字符串类型String与Objc的提供的字符串Nsstring有很大的不同对比如下:(1)Objc中的字符串对应的是一个类Nsstring,是引用类型;而Swift的字符串String对应的是一种值类型.(2)形式上,Swift字符串前面不需要加上@符号(3)使用var定义的字符串则是Objc中的可变字符串;使用let定义的字符串为Objc对应的不可变字符串(4)字符串本质上

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部