Qt3:List、QMap、QVariant等容器类

前言

Qt提供了一组通用的基于模板的容器类。对比 C++的标准模板库中的容器类,Qt的这些容器更轻量、更安全并且更容易使用。此外,Qt 的容器类在速度、内存消耗和内联 (inline)代码等方面进行了优化(较少的内联代码将缩减可执行程序的大小)。
存储在 Qt 容器中的数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数(不需要参数的构造函数)、一个复制构造函数和一个赋值操作运算符。
这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如 int 和 double等)和Qt 的一些数据类型(如 QString、QDate 和 QTime 等)。不过,Qt 的 QObjeat 及其他的子类(如QWidget 和 Qdialog 等)是不能够存储在容器中的。

一、QList类存储数据

/* -------------------- 1、 QString类型列表 -------------------- */
QList<QString> list;            // 声明了一个QList<QString>栈对象

// { }作用域 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<int>::iterator读写迭代器
QList<int>::iterator i;
for(i=list.begin(); i != list.end(); ++i)
{
    qDebug() << (*i);   // 读取列表项
    *i = (*i) * 10;     // 将列表项扩大10倍
}

// 初始化一个QList<int>::const_iterator读写迭代器
QList<int>::const_iterator ci;

// 在控制台输出列表的所有值
for(ci=list.constBegin(); ci != list.constEnd(); ++ci)
    qDebug() << *ci;

三、QMap类(JAVA风格迭代器插入、遍历、修改)

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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值