Qt 6.4 и более поздние версии
Используйте QMap::asKeyValueRange следующим образом:
for (auto [key, value] : map.asKeyValueRange())
{
qDebug() << key << value;
}
С Qt 5.10 по Qt 6.3
Используйте QMap::keyValueBegin и QMap::keyValueEnd следующим образом:
for (auto it = map.keyValueBegin(); it != map.keyValueEnd(); ++it)
{
qDebug() << it->first << it->second;
}
Функция QMap::asKeyValueRange
может быть перенесена из Qt 6.4 с помощью всего нескольких строк кода, что позволяет использовать диапазоны значений ключей в Qt 5.10 и Qt 6.3 (требуется C++17):
for (auto [key, value] : asKeyValueRange(map))
{
qDebug() << key << value;
}
С Qt 4 по Qt 5.9
Используйте QMap::begin и QMap::end следующим образом:
for (auto it = map.begin(); it != map.end(); ++it)
{
qDebug() << it.key() << it.value();
}
Цикл можно обернуть в диапазон с помощью нескольких строк дополнительного кода, что позволит использовать циклы на основе диапазонов for
в Qt 4 и Qt 5.9 (требуется C++11):
for (auto it : toRange(map))
{
qDebug() << it.key() << it.value();
}
Другие варианты
Используйте QMap::toStdMap, чтобы преобразовать карту в std::map
и затем выполнить итерацию по ней. Обратите внимание, что производительность будет низкой, так как при этом будет скопирована вся карта.
for (auto it : map.toStdMap())
{
qDebug() << it.first << it.second;
}
Переберите QMap::keys и найдите каждое связанное с ним QMap::value. Обратите внимание, что производительность будет крайне низкой, так как при этом будут скопированы все ключи, а затем отдельно будет выполняться поиск каждого значения.
for (auto key : map.keys())
{
qDebug() << key << map.value(key);
}