В стандартной документации Qt написано, что перебрать элементы объекта класса QMap или QHash можно через инструкцию foreach.
К сожалению, приводимый пример показывает, как перебрать значения QMap. А каким образом получить еще и ключи - не объясняется. Есть только ссылка на использование итераторов.
Перебор значений в официальной документации Qt выглядит так:
QMap<QString, int> map;
...
foreach (int value, map)
cout << value << endl;
Видно, что тут перебираются значения (value), а ключи (key) тут отсутсвуют.
Тем не менее, есть возможность перебрать и key, и value без итераторов. Делается это при помощи методов map.keys() и map.value() вот так:
QMap<QString, int> map;
...
foreach (QString key, map.keys())
{
int value=map.value(key);
qDebug() << key << ":" << value;
}
Считается, что такой метод работает медленнее итераторов. Но он один из самых удобных.
Примечание. Иногда возникает вопрос: как удалять элементы при обходе списка QList или массива QVector? Об идеологически верном методе удаления написано в статье Как правильно удалять элементы из QVector или из QList в момент обхода массива (списка).