- 前言
- 一、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类存储数据
/* -------------------- 1、 QString类型列表 -------------------- */
QList<QString> list; // 声明了一个QList栈对象
// { }作用域 QList保存的是对象的复制
{
QString str("test");
list<<str; // 字符串存入列表
}
qDebug() << list[0] << "end";
二、QList迭代器遍历
1、JAVA类型只读遍历
QList<int> list;
list << 1 << 2 << 3 << 4 << 5;
// 以该list作为参数初始化一个QListIterator对象,此时迭代点处在第一个列表项"1"的前面(并不是指向该列表项)
QListIterator<int> 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(); // 返回下一个列表项,但不移动迭代点
}
2、JAVA类型读写遍历
QList<int> list; // 创建列表
QMutableListIterator<int> 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(); // 返回下一个列表项,但不移动迭代点
}
3、STL风格迭代器遍历
QList<int> list; // 创建列表
for(int j=0; j<10; j++)
list.insert(list.end(),j); // 插入10个整数值
// 初始化一个QList::iterator读写迭代器
QList<int>::iterator i;
for(i=list.begin(); i != list.end(); ++i)
{
qDebug() << (*i); // 读取列表项
*i = (*i) * 10; // 将列表项扩大10倍
}
// 初始化一个QList::const_iterator读写迭代器
QList<int>::const_iterator ci;
// 在控制台输出列表的所有值
for(ci=list.constBegin(); ci != list.constEnd(); ++ci)
qDebug() << *ci;
三、QMap类(JAVA风格迭代器插入、遍历、修改)
QMap
QMap<QString,QString> map; // 创建一个QMap对象
// 插入键值对
map.insert("beijing","111");
map.insert("zhengzhou","021");
map.insert("shanghai","025");
// 创建一个只读迭代器
QMapIterator<QString,QString> i(map);
// 向后遍历
for(i.toFront();i.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项
{
i.next(); // 跳过下一个列表项,并返回跳过的列表项内容
qDebug() << i.key() << " " << i.value();
}
// 创建一个读写迭代器
QMutableMapIterator<QString,QString> mi(map);
if(mi.findNext("111"))
mi.setValue("010");
// 向后遍历
for(mi.toFront();mi.hasNext();) // 将迭代点移动到第一个列表项前面;检查当前迭代点之后是否有列表项
{
mi.next(); // 跳过下一个列表项,并返回跳过的列表项内容
qDebug() << mi.key() << " " << mi.value();
}
四、QVariant类
QVariant类类似于C++的联合(union)数据类型,不仅能够保存很多Qt类型的值,而且也能存放Qt容器类型的值。
QVariant v(709); // 声明一个变量V,并初始化为一个整数
qDebug() << v.toInt(); // 类型转换并打印
QVariant w("test"); // 声明一个变量w,并初始化为一个字符串
qDebug() << w.toString(); // 类型转换并打印
QMap<QString,QVariant>map; // 声明一个变量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<QColor>();
// 创建一个字符串列表
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<list.size(); ++i)
qDebug() << list.at(i);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)