Qt3:List、QMap、QVariant等容器类

Qt3:List、QMap、QVariant等容器类,第1张

List、QMap、QVariant等容器类
  • 前言
  • 一、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提供了一个从类型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);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存