Sur cette page

Le mot-clé foreach de Qt

Le mot-clé foreach

Note : Le mot-clé foreach a été introduit avant que les boucles C++11 basées sur la plage n'existent. Le nouveau code devrait préférer les boucles basées sur la plage C++11.

Le mot-clé foreach est un ajout spécifique à Qt XML au langage C++ et est implémenté à l'aide du préprocesseur.

Sa syntaxe est la suivante : foreach (variable, conteneur) statement. Par exemple, voici comment utiliser foreach pour itérer sur QList<QString> :

QList<QString> valeurs ;//...QString str ; foreach (str, values)    qDebug() << str;

Le code foreach est nettement plus court que le code équivalent qui utilise des itérateurs :

QList<QString> values ;//...QListIterator<QString> i(values) ;while (i.hasNext()) { QString s = i.next() ;    qDebug() << s;
}

Sauf si le type de données contient une virgule (par exemple, std::pair<int, int>), la variable utilisée pour l'itération peut être définie dans l'instruction foreach:

QList<QString> values ;//...foreach(const QString &str, values)    qDebug() << str;

Et comme toute autre construction de boucle C++, vous pouvez utiliser des accolades autour du corps d'une boucle foreach, et vous pouvez utiliser break pour quitter 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), de sorte que vous ne devez pas appeler values() sur le conteneur (cela générerait une copie inutile, voir ci-dessous). Si vous souhaitez itérer sur les clés et les valeurs, vous pouvez utiliser des itérateurs (qui sont plus rapides), ou vous pouvez obtenir les clés et les utiliser pour obtenir les valeurs également :

QMap<QString,  int> map ;//...foreach(const QString &str, map.keys())    qDebug() << str << ':' << map.value(str);

Pour une carte multi-valuée :

QMultiMap<QString,  int> map ;//...foreach(const QString &str, map.uniqueKeys()) { foreach(int i, map.values(str))        qDebug() << str << ':' << i;
}

Qt prend 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 toujours lieu, mais grâce au partage implicite, la copie d'un conteneur est très rapide).

Puisque foreach crée une copie du conteneur, l'utilisation d'une référence non-const pour la variable ne permet pas de modifier le conteneur original. Cela n'affecte que la copie, ce qui n'est probablement pas ce que vous voulez.

Une alternative à la boucle foreach de Qt XML est la boucle for basée sur la plage qui fait partie de C++11 et des versions plus récentes. Cependant, gardez à l'esprit que la boucle for basée sur la plage peut forcer un conteneur Qt à se détacher, alors que foreach ne le fait pas. Mais l'utilisation de foreach copie toujours le conteneur, ce qui n'est généralement pas bon marché pour les conteneurs STL. En cas de doute, préférez foreach pour les conteneurs Qt et for pour les conteneurs STL.

Vous pouvez supprimer la disponibilité de la boucle foreach de Qt 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.