- 前言
- 一、QList类存储数据
- 二、QList迭代器遍历
- 1、JAVA类型只读遍历
- 2、JAVA类型读写遍历
- 3、STL风格迭代器遍历
- 三、QMap类(JAVA风格迭代器插入、遍历、修改)
- 四、QVariant类
Qt提供了一组通用的基于模板的容器类。对比 C++的标准模板库中的容器类,Qt的这些容器更轻量、更安全并且更容易使用。此外,Qt 的容器类在速度、内存消耗和内联 (inline)代码等方面进行了优化(较少的内联代码将缩减可执行程序的大小)。 存储在 Qt 容器中的数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数(不需要参数的构造函数)、一个复制构造函数和一个赋值操作运算符。 这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如 int 和 double等)和Qt 的一些数据类型(如 QString、QDate 和 QTime 等)。不过,Qt 的 QObjeat 及其他的子类(如QWidget 和 Qdialog 等)是不能够存储在容器中的。一、QList类存储数据
QListlist; // 声明了一个QList 栈对象 // { }作用域 QList保存的是对象的复制 { QString str("test"); list< 二、QList迭代器遍历 1、JAVA类型只读遍历 QList2、JAVA类型读写遍历list; list << 1 << 2 << 3 << 4 << 5; // 以该list作为参数初始化一个QListIterator对象,此时迭代点处在第一个列表项"1"的前面(并不是指向该列表项) QListIterator i(list); // 创建列表的只读迭代器 // 向后遍历 i.toFront(); // 将迭代点移动到第一个列表项之前 for(;i.hasNext();) // 调用hasNext函数检查当前迭代点之后是否有列表项,有则调用next进行遍历 qDebug() << i.next(); // 跳过下一个列表项(迭代点位于第一个列表项和第二个列表项之间),并返回跳过的列表项内容 // 向前遍历 i.toBack(); // 将迭代点移动到最后一个列表项后面 for(;i.hasPrevious();) // 检查当前迭代点之前是否有列表项 qDebug() << i.previous(); // 跳过前一个列表项,并返回跳过的列表项内容 // 向后查找指定项,找到返回true,迭代点位于匹配项后面,未找到返回false,迭代点位于列表项后端 if(i.findNext(2) == true) { qDebug() << i.peekPrevious(); // 返回前一个列表项,但不移动迭代点 } // 向前查找指定项,找到返回true,迭代点位于匹配项前面,未找到返回false,迭代点位于列表项前端 if(i.findPrevious(2) == true) { qDebug() << i.peekNext(); // 返回下一个列表项,但不移动迭代点 } QList3、STL风格迭代器遍历list; // 创建列表 QMutableListIterator i(list); // 创建列表的读写迭代器 for(int j=0; j<10 ;j++) // 通过迭代器进行插入操作,为列表插入数值 i.insert(j); // 向后遍历 for(i.toFront();i.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项 qDebug() << i.next(); // 跳过下一个列表项,并返回跳过的列表项内容 // 向前遍历 for(i.toBack();i.hasPrevious();) // 将迭代点移动到最后一个列表项后面;检查当前迭代点之前是否有列表项 { if(i.previous()%2 == 0) // 跳过前一个列表项,并返回跳过的列表项内容,判断为偶数则删除,为奇数则扩大10倍 { i.remove(); } else i.setValue(i.peekNext()*10); // 返回下一个列表项,但不移动迭代点,*10后设置为当前项 } // 向后遍历,重新遍历并输出 for(i.toFront();i.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项 qDebug() << i.next(); // 跳过下一个列表项,并返回跳过的列表项内容 // 向后查找指定项,找到返回true,迭代点位于匹配项后面,未找到返回false,迭代点位于列表项后端 i.toFront(); // 将迭代点移动到第一个列表项前面 if(i.findNext(30) == true) { qDebug() << i.peekPrevious(); // 返回前一个列表项,但不移动迭代点 } // 向前查找指定项,找到返回true,迭代点位于匹配项前面,未找到返回false,迭代点位于列表项前端 i.toBack(); // 将迭代点移动到最后一个列表项后面 if(i.findPrevious(30) == true) { qDebug() << i.peekNext(); // 返回下一个列表项,但不移动迭代点 } QList三、QMap类(JAVA风格迭代器插入、遍历、修改)list; // 创建列表 for(int j=0; j<10; j++) list.insert(list.end(),j); // 插入10个整数值 // 初始化一个QList ::iterator读写迭代器 QList ::iterator i; for(i=list.begin(); i != list.end(); ++i) { qDebug() << (*i); // 读取列表项 *i = (*i) * 10; // 将列表项扩大10倍 } // 初始化一个QList ::const_iterator读写迭代器 QList ::const_iterator ci; // 在控制台输出列表的所有值 for(ci=list.constBegin(); ci != list.constEnd(); ++ci) qDebug() << *ci; QMap
提供了一个从类型Key的键到类型为T的值的映射。 QMap四、QVariant类map; // 创建一个QMap对象 // 插入键值对 map.insert("beijing","111"); map.insert("zhengzhou","021"); map.insert("shanghai","025"); // 创建一个只读迭代器 QMapIterator i(map); // 向后遍历 for(i.toFront();i.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项 { i.next(); // 跳过下一个列表项,并返回跳过的列表项内容 qDebug() << i.key() << " " << i.value(); } // 创建一个读写迭代器 QMutableMapIterator mi(map); if(mi.findNext("111")) mi.setValue("010"); // 向后遍历 for(mi.toFront();mi.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项 { mi.next(); // 跳过下一个列表项,并返回跳过的列表项内容 qDebug() << mi.key() << " " << mi.value(); } QVariant类类似于C++的联合(union)数据类型,不仅能够保存很多Qt类型的值,而且也能存放Qt容器类型的值。
QVariant v(709); // 声明一个变量V,并初始化为一个整数 qDebug() << v.toInt(); // 类型转换并打印 QVariant w("test"); // 声明一个变量w,并初始化为一个字符串 qDebug() << w.toString(); // 类型转换并打印 QMapmap; // 声明一个变量map,字符串为键,QVariant为值 map["int"] = 709; map["double"] = 709.709; map["string"] = "test"; map["color"] = QColor(255,0,0); // 调用相应的转换函数并输出 qDebug() << map["int"] << map["int"].toInt(); qDebug() << map["double"] << map["double"].toDouble(); qDebug() << map["string"] << map["string"].toString(); qDebug() << map["color"] << map["color"].value (); // 创建一个字符串列表 QStringList sl; sl << "a" << "b" << "c" << "d"; QVariant slv(sl); if(slv.type() == QVariant::StringList) // 返回存储在QVariant中的值的数据类型 { QStringList list = slv.toStringList(); for(int i=0; i



