2

我想在迭代列表时修改列表对象的原始内容。我一直在尝试使用 2 种方法:第一种 -> 使用 for 循环 -> 可以正常工作,但我不确定这是最好的选择,第二种使用QMutableListIterator完全没有改变对象和我认为也许我没有正确使用它。下面是我的 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
    }
4

2 回答 2

1

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

来自文档:

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

于 2013-09-29T08:10:12.390 回答
1

您的第一种方法非常好,无需担心:-) 在 Qt 中, aQList<T>不是像 那样的链表std::list<T>,而是一个容器,可以为您提供平均恒定的访问时间。

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

于 2013-09-29T07:44:55.180 回答