Qt C ++迭代时修改列表中的对象

时间:2013-09-29 07:13:17

标签: c++ qt

我希望在迭代列表的同时修改列表对象的原始内容。我一直在尝试使用两种方式:第一种 - >使用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
    }

2 个答案:

答案 0 :(得分:1)

你的第一种方法非常好,没什么值得担心的:-)在Qt中,QList<T>不是像std::list<T>那样的链接列表,而是一个容器,可以为你提供平均的访问时间。

如果您仍想使用迭代器,请不要使用QMutableListIterator<Vehicle>,而应使用QList<Vehicle>::iterator

答案 1 :(得分:1)

QMutableListIterator用于在您进行迭代时修改列表,例如插入/删除项目。那么它不适合您的任务。实际上,文档指出当你调用next()时,迭代器指向连续的元素。也许这个细节会阻止您的更改按预期显示。

来自docs:

  T&amp; T&amp; QMutableListIterator :: next()   返回对下一个项目的引用,并将迭代器前进一个位置