我希望在迭代列表的同时修改列表对象的原始内容。我一直在尝试使用两种方式:第一种 - >使用for循环 - >这是正常工作,但我不确定这是最好的选择,第二个使用QMutableListIterator
并没有改变任何对象,我认为maibe我没有使用它corectly。下面是我的2个实现。
第一个
QString idNumber = getIDNumberFromSelectedRow(id);
QUuid carId = QUuid(idNumber);
for(int i = 0; i < cars.size(); i++){
Vehicle& current = cars[i];
if(carId == current.getVehicleID()){
addDialog = new AddEditDialog(this);
addDialog->loadVehicleToEdit(current); // i am loading the data from the object i want to edit
addDialog->exec();
if(addDialog->getIsEdited()){ //i'm editing the object
current = addDialog->getVehicleToAdd(); //i'm saving the modifications
current.setVehicleId(carId);
}
}//the object from the list is now modified
}
第二个
QMutableListIterator<Vehicle> iterator(cars);
while(iterator.hasNext()){
Vehicle& current = iterator.next();
if(carId == current.getVehicleID()){
addDialog = new AddEditDialog(this);
addDialog->loadVehicleToEdit(current); //load the object data to modify
addDialog->exec();
if(addDialog->getIsEdited()){//edit the object
current = addDialog->getVehicleToAdd();//save the modifications
iterator.setValue(current);
}
}//the object from the list is not modified at all
}
答案 0 :(得分:1)
你的第一种方法非常好,没什么值得担心的:-)在Qt中,QList<T>
不是像std::list<T>
那样的链接列表,而是一个容器,可以为你提供平均的访问时间。
如果您仍想使用迭代器,请不要使用QMutableListIterator<Vehicle>
,而应使用QList<Vehicle>::iterator
。
答案 1 :(得分:1)
QMutableListIterator用于在您进行迭代时修改列表,例如插入/删除项目。那么它不适合您的任务。实际上,文档指出当你调用next()时,迭代器指向连续的元素。也许这个细节会阻止您的更改按预期显示。
来自docs:
T&amp; T&amp; QMutableListIterator :: next() 返回对下一个项目的引用,并将迭代器前进一个位置。