这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和Qt的一些数据类型(如QString、QDate和QTime等)。不过,Qt的QObject及其他的子类(如QWidget和Qdialog等)是不能够存储在容器中的,例如:
QList<QToolBar> list;
上述代码是无法通过编译的,因为这些类(QObject及其他的子类)没有复制构造函数和赋值操作运算符。
一个可代替的方案是存储QObject及其子类的指针,例如:
QList<QToolBar*> list;
Qt的容器类是可以嵌套的,例如:
QHash<QString, QList<double> >
1.QList类
对于不同的数据类型,QList<T>采取不同的存储策略,存储策略有以下几种。
(1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList<T>会将数值直接存储在它的数组中。
(2)如果QList<T>存储对象的指针,则该指针指向实际存储的对象。
下面举一个例子:
#include <QDebug>
int main(int argc,char *argv[])
{
QList<QString> list; //(a)
{
QString str("This is a test string");
list<<str; //(b)
} //(c)
qDebug()<<list[0]<< "How are you! ";
return 0;
}
2.QLinkedList类
QLinkedList<T>是一个链式列表,它以**非连续的内存块**保存数据。
QLinkedList<T>**不能使用下标,只能使用迭代器访问它的数据项**。与QList相比,当对一个很大的列表进行插入操作时,QLinkedList具有更高的效率。
3.QVector类
QVector<T>在**相邻的内存中存储给定数据类型T的一组数值**。在一个QVector的前部或者中间位置进行插入操作的速度是很慢的,这是因为这样的操作将导致内存中的大量数据被移动,这是由QVector存储数据的方式决定的。

(1)QList只读遍历方法。
【例】(简单) 通过控制台程序实现QList只读遍历方法。
其具体代码如下:
#include <QDebug> //(a)
int main(int argc,char *argv[])
{
QList<int> list; //创建一个QList<int>栈对象list
list<<1<<2<<3<<4<<5; //用操作运算符“<<”输入五个整数
QListIterator<int> i(list); //(b)
for(;i.hasNext();) //(c)
qDebug()<<i.next();
return 0;
}
最后程序的运行结果为:
1 2 3 4 5
QListIterator::toBack():将迭代点移动到最后一个列表项的后面。
QListIterator::hasPrevious():检查当前迭代点之前是否具有列表项。
QListIterator::previous():返回前一个列表项的内容并将迭代点移动到前一个列表项之前。
toFront():移动迭代点到列表的前端(第一个列表项的前面)。
peekNext():返回下一个列表项,但不移动迭代点。
peekPrevious():返回前一个列表项,但不移动迭代点。
findNext():从当前迭代点开始向后查找指定的列表项,如果找到,则返回true,此时迭代点位于匹配列表项的后面;如果没有找到,则返回false,此时迭代点位于列表的后端(最后一个列表项的后面)。
findPrevious():与findNext()类似,不同的是它的方向是向前的,查找操作完成后的迭代点在匹配项的前面或整个列表的前端。
例】(简单) 使用STL风格迭代器。
具体代码如下:
#include <QDebug>
int main(int argc,char *argv[])
{
QList<int> list; //初始化一个空的QList<int>列表
for(int j=0;j<10;j++)
list.insert(list.end(),j); //(a)
QList<int>::iterator i; //初始化一个QList<int>::iterator读写迭代器
for(i=list.begin();i!=list.end();++i) //(b)
{
qDebug()<<(*i);
*i=(*i)*10;
}
//初始化一个QList<int>:: const_iterator读写迭代器
QList<int>::const_iterator ci;
//在控制台输出列表的所有值
for(ci=list.constBegin();ci!=list.constEnd();++ci)
qDebug()<<*ci;
return 0;
}
最后编译,运行此应用程序,输出结果如下:
0 1 2 3 4 5 6 7 8 9
0 10 20 30 40 50 60 70 80 90