Palabra clave foreach de Qt
La palabra clave foreach
Nota: La palabra clave foreach se introdujo antes de que existieran los bucles basados en rangos de C++11. El nuevo código debería preferir los bucles basados en rangos de C++11.
La palabra clave foreach es una adición específica de Qt al lenguaje C++, y se implementa usando el preprocesador.
Su sintaxis es: foreach (variable, contenedor) sentencia. Por ejemplo, aquí está cómo usar foreach para iterar sobre un QList<QString>:
El código foreach es significativamente más corto que el código equivalente que utiliza iteradores:
QList<QString> valores;//...QListIterator<QString> i(valores);while (i.hasNext()) { QString s = i.next(); qDebug() << s; }
A menos que el tipo de datos contenga una coma (por ejemplo, std::pair<int, int>), la variable utilizada para la iteración puede definirse dentro de la sentencia foreach:
Y como cualquier otra construcción de bucle C++, puede utilizar llaves alrededor del cuerpo de un bucle foreach, y puede utilizar break para salir del bucle:
QList<QString> valores;//...foreach(const QString &str, valores) { if (str.isEmpty()) break; qDebug() << str; }
Con QMap y QHash, foreach accede al componente valor de los pares (clave, valor) automáticamente, por lo que no debes llamar a values() en el contenedor (generaría una copia innecesaria, ver más abajo). Si quieres iterar tanto sobre las claves como sobre los valores, puedes usar iteradores (que son más rápidos), o puedes obtener las claves, y usarlas para obtener también los valores:
QMap<QStringint> map;//...foreach(const QString &str, map.keys()) qDebug() << str << ':' << map.value(str);
Para un mapa multivaluado:
QMultiMap<QString, int> map;//...foreach(const QString &str, map.uniqueKeys()) { foreach(int i, map.values(str)) qDebug() << str << ':' << i; }
Qt toma automáticamente una copia del contenedor cuando entra en un bucle foreach. Si modificas el contenedor mientras estás iterando, eso no afectará al bucle. (Si no modificas el contenedor, la copia sigue teniendo lugar, pero gracias a la compartición implícita copiar un contenedor es muy rápido).
Como foreach crea una copia del contenedor, usar una referencia no-const para la variable no te permite modificar el contenedor original. Sólo afecta a la copia, que probablemente no es lo que quieres.
Una alternativa al bucle foreach de Qt es el rango basado en for que forma parte de C++11 y posteriores. Sin embargo, ten en cuenta que for puede forzar a un contenedor Qt a separarse, mientras que foreach no lo haría. Pero usar foreach siempre copia el contenedor, lo que no suele ser barato para los contenedores STL. En caso de duda, prefiera foreach para los contenedores Qt, y for basado en rangos para los contenedores STL.
Puedes eliminar la disponibilidad del bucle foreach de Qt definiendo la macro QT_NO_FOREACH.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.