【2.1字符串类】
C++提供了两种字符串:(1)C语言风格 “\0”字符结尾的字符数组
(2)字符串类QString 功能更强大,16位Unicode值
操作字符串:
常用这种:方便的字符串组合方式,使用QString::arg()函数,推荐就使用这种方法:
例如:
QString Str;
Str = QString("%1 was born in %2.").arg("John").arg("1998");//str = "John was born in 1998."
为了简化代码可读性,建议采用这种格式进行整理。
Str = QString("%1 was born in %2.")
.arg("John")
.arg("1998");
一些QT组合字符串的方法:
(1)insert()函数 (2)prepend()函数 (3)replace()函数
(4)去掉字符串两端的空白(空白字符包括:回车字符“\n”,换行字符“\r”,制表字符”\t”,空格字符”“)
QString::trimmed()函数
QString::simplified()函数
2.1.2 查询字符串类
(1)QString::startWith() (2)QString::endWith() (3)QString::contains()
(4)
2.1.3 字符串的转换
(1)QString::toInt()函数将字符串转换为整型数值,两个参数
第一个参数是:bool类型的指针,用于返回转换状态
第二个参数是:是转换的基数:0表示将采用C语言转换法 0X开头,则基数为16,若字符串以0开头,则基数为8
(2)QString提供的字符串编码集的转换函数将会返回一个const char*类型版本的QByteArray,即构造函数QByteArray(const char*)构造的QByteArray对象
QByteArray类具有一个字节数组,他即可以存储原始字节(raw bytes)
也可以存储”\0”结尾的8位字符串。尽量使用QbyteArray,支持隐式共享
(1)toAscii() (2)toLatin1() (3)toUtf8() (4)toLocal8Bit()
注意NULL字符串和(empty)空字符串的区别:
【2.2容器类】
QT提供了一组通过基于模板的容器类。
Qt的QObject及其他子类(如QWidget和QDialog等)是不能够存储到容器中的:
例如
QList<QToolBar>list;
上述代码是无法通过编译,因为这些类(QObject及其他的子类)没有复制构造函数和赋值操作运算符
一个可替代的方案是存储QObject及其子类的指针,例如:
QList<QToolBar*>list;
Qt的容器类是可以做嵌套的,例如
QHash<QString,QList<double> >
格式是需要注意的。
QT的容器类为遍历其中的内容提供了一下两种的方法:
(1)Java风格的迭代器
(2)STL风格的迭代器(STL-style iterators)
2.2.1 QList类、QLinkedList类和QVector类
1.QList<T>
维护了一个指针数组,该数组存储的指针指向QList存储的列表项内容
QList<T>
提供了基于下标的快速访问。
对于不同类型的数据类型:QList<T>
采取不同的存储策略
(1)如果T是一个指针类型的或者指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同)
QList<T>
会有数值直接存储在他的数组中
(2)如果QList<T>
存储对象的指针,则该指针指向实际存储对象。
JAVA风格迭代器遍历容器
遍历分为只读遍历和读写遍历
这两句非常重要
QList<int>list;//创建一个QList<int>栈对象
QListIterator<int>i(list)
:以该list参数初始化一个QListIterator对象i,此时迭代点处在第一个列表项“1”的前面(注意,并不是指向该列表项)
只能查,不能增删补
QList<int>list; //创建一个空的列表list
QMutableListIterator<int> i(list); //创建上述列表的读写迭代器
STL风格迭代器遍历容器
STL风格迭代器的API是建立在指针操作的基础上,例如,“++”操作运算符移动到迭代器到下一个项(item)
而“*”操作运算符返回迭代器指向的项
QList<int>list;//初始化一个空的QList<int>列表
QList<int>::iterator i;//初始化一个QList<int>::iterator读写迭代器
QList<int>::const_iterator ci;//初始化一个QList<int>::iterator读写迭代器
QMap类和QHash类
说几点区别:
QHash具有比QMap更快的查找速度
QHash以任意的顺序存储速度,QMap总按照键Key的顺序存储数据
QHash的键类型Key必须提供一个operator==()和一个全局的qHash(Key)函数
QMap的键类型Key必须提供operator<()函数
QMap<Key,T>
提供了一个从类型为Key的键到类型为T的值的映射
支持一键多值情况。
QHash<Key,T>
推荐使用QHash作为存放数据的容器
Java风格迭代器分为两种:只读迭代器类和读写迭代器类
QMap<QString,QString>map;//创建一个QMap栈对象
QMapIterator<QString,QString>i(map);//创建一个只读迭代器。
QMutableMapIterator<QString,QString>modi(map);//创建一个读写迭代器
STL风格迭代器器遍历容器
QMap<QString,QString>map;//创建一个QMap栈对象
QMap<QString,QString>::iterator mi;
QMap<QString,QString>::const_iterator modi;
QVariant类
QVariant类类似于C++的联合(union)数据类型,它不仅能够保存很多Qt类型的值。