“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章, 点击查看活动详情 ”
在使用QList时,需要进行删除某一项的操作,发现QList提供了两个移除的方法,一个是removeAt(),一个是takeAt()。我创建的是一个存放指针变量的QList,需要实现两个功能,一个是移除并销毁item,一个是移除但是不销毁item。在选择这两个方法时就产生了疑问。于是查阅了官方帮助和网上资料做对比,总结一下这两个方法的区别。
这里说明两个方法都是移除QList某一项的方法,不同的地方在于,removeAt()没有返回值,而takeAt()会返回移除的项的值。
用一个简单的例子说明一下这两个方法的区别:
QList<int> list;
list << 1 << 2 << 3;
//removeAt
list.removeAt(0);
qDebug() << list; //结果:2,3
//takeAt
int i = list.takeAt(0)
qDebug() << i; //结果:1
qDebug() << list; //结果:2,3
这两个方法都移除了列表的第一项,不同的是,takeAt方法可以返回移除项的值。
当QList中的类型为指针类型时(即每一项存入的都是一个动态创建的内存的指针),移除某一项时的操作:
如果QList为指向T类型项的指针数组,那么QList将项直接存储在指针数组中。
QList只保存你传入的基本指针,而不去或者不能知道这些指针是被怎么创建的,在何处创建的。所以在移除一个指针项时,只是将这个指针从列表中移出,而指针所指向的内存并没有被释放。如果需要释放,那么需要自己手动进行释放。
QList<MyClass *> list;
for(int i=0; i<3; i++)
MyClass *myclass = new MyClass(this);
list.append(myclass);
//removeAt
removeAt(0); // 移除第0项存放的指针地址, 指针指向的内存没有被释放
//takeAt
MyClass * item = takeAt(0); //移除第0项,并释放该指针指向的内存
delete item;
item = nullptr;
这两个方法都不能实现移除但是不销毁item,我们需要重新创建一个相同的item进行保存。