直接通过迭代就可以修改:
struct LinkageAxis_t{
uint32_t x;
uint32_t y;
uint32_t z;
};
QHash<int,LinkageAxis_t> hash;
hash.insert(0,{00,01,02});
hash.insert(1,{10,11,12});
hash.insert(2,{20,21,22});
for(auto &val : hash){
qDebug("val:%d",val.x);
val.x += 100;
}
for(auto &val : hash){
qDebug("val2:%d",val.x);
}但是,QHash直接获取元素后是不能修改的:
auto &val = hash.value(0); val.x += 100;
以及:
QList<LinkageAxis_t> list;
list.append({00,01,02});
list.append({10,11,12});
list.append({20,21,22});
auto &lval = list.value(0);都是错误的。
还有种方法,就是通过迭代器来修改:
QHash<int,LinkageAxis_t>::iterator it; for (it = hash.begin(); it != hash.end(); ++it) it.value().x += 2;
没想到吧,但上面的方法是要进入循环,不能单个修改。这样修改单个会出现时间浪费的问题。
单个的只能使用括号重载符了:
list[0].x = 2,或者
hash[1].x = 2
不过要判断这个元素是否有效,特别是指针元素的情况下!
还有种方法:
// 通过迭代器查找,找到以后返回引用,然后直接改,有点像迭代器循环修改,不过这是单个的
QHash<QString, int> hash;
...
QHash<QString, int>::iterator i = hash.find("HDR");
if(i != hash.end() && i.key() == "HDR") {
i.value() = NewValue;
}如果有重复的key,可以搞个while来一直迭代,不过我们最好不要用重复的key。