Le mot-clé « foreach » de Qt
Le mot-clé « foreach »
Remarque : le mot-clé « foreach » a été introduit avant l'apparition des boucles basées sur des plages en C++11. Dans les nouveaux codes, il est préférable d'utiliser les boucles basées sur des plages de C++11.
Le mot-clé « foreach » est un ajout spécifique à Qt au langage C++, et il est implémenté à l'aide du préprocesseur.
Sa syntaxe est la suivante : foreach (variable, conteneur) instruction. Par exemple, voici comment utiliser foreach pour parcourir un QList<QString> :
Le code « foreach » est nettement plus court que le code équivalent utilisant des itérateurs :
QList<QString> valeurs ;
//...
QListIterator<QString> i(values);
while (i.hasNext()) {
QString s = i.next();
qDebug() << s;
}À moins que le type de données ne contienne une virgule (par exemple, std::pair<int, int>), la variable utilisée pour l’itération peut être définie dans l’instruction foreach:
Et comme pour toute autre structure de boucle en C++, vous pouvez utiliser des accolades pour encadrer le corps d'une boucle « foreach », et utiliser « break » pour sortir de la boucle :
QList<QString> values;
//...
foreach (const QString&str, values) {
if (str.isEmpty())
break;
qDebug() << str;
}Avec QMap et QHash, foreach accède automatiquement à la composante « valeur » des paires (clé, valeur) ; vous ne devez donc pas appeler la méthode values() sur le conteneur (cela générerait une copie inutile, voir ci-dessous). Si vous souhaitez parcourir à la fois les clés et les valeurs, vous pouvez utiliser des itérateurs (qui sont plus rapides), ou bien récupérer les clés et les utiliser pour obtenir également les valeurs :
QMap<QString, int> map;
//...
foreach (const QString&str, map.keys())
qDebug() << str << ':' << map.value(str);Pour une application à valeurs multiples :
QMultiMap<QString, int> map;
//...
foreach (const QString&str, map.uniqueKeys()) {
foreach (int i, map.values(str))
qDebug() << str << ':' << i;
}Qt effectue automatiquement une copie du conteneur lorsqu'il entre dans une boucle « foreach ». Si vous modifiez le conteneur pendant l'itération, cela n'affectera pas la boucle. (Si vous ne modifiez pas le conteneur, la copie a tout de même lieu, mais grâce au partage implicite, la copie d'un conteneur est très rapide.)
Comme `foreach` crée une copie du conteneur, l'utilisation d'une référence non-const pour la variable ne vous permet pas de modifier le conteneur d'origine. Cela n'affecte que la copie, ce qui n'est probablement pas ce que vous souhaitez.
Une alternative à la boucle « foreach » de Qt est la boucle « for » basée sur des plages, qui fait partie de C++11 et des versions plus récentes. Cependant, gardez à l’esprit que la boucle « for » basée sur des plages peut forcer un conteneur Qt à se détacher, alors que la boucle « foreach » ne le ferait pas. Mais l’utilisation de « foreach » copie toujours le conteneur, ce qui n’est généralement pas sans impact pour les conteneurs STL. En cas de doute, privilégiez foreach pour les conteneurs Qt, et l'for, basée sur une plage, pour les conteneurs STL.
Vous pouvez désactiver la boucle « foreach » de Qt XML en définissant 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.