直接通过迭代就可以修改:
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。