Das Schlüsselwort „foreach“ in Qt
Das Schlüsselwort „foreach“
Hinweis: Das Schlüsselwort „foreach“ wurde eingeführt, bevor es die bereichsbasierten Schleifen von C++11 gab. In neuem Code sollten vorzugsweise die bereichsbasierten Schleifen von C++11 verwendet werden.
Das Schlüsselwort „ foreach “ ist eine Qt-spezifische Erweiterung der Sprache C++ und wird mithilfe des Präprozessors implementiert.
Die Syntax lautet: ` foreach (Variable, Container) Anweisung`. Hier ein Beispiel für die Verwendung von ` foreach ` zur Durchlaufung eines ` QList` <QString>:
Der Code „ foreach “ ist deutlich kürzer als der entsprechende Code, der Iteratoren verwendet:
QList<QString> Werte;
//...
QListIterator<QString> i(values);
while (i.hasNext()) {
QString s = i.next();
qDebug() << s;
}Sofern der Datentyp kein Komma enthält (z. B. std::pair<int, int>), kann die für die Iteration verwendete Variable innerhalb der Anweisung „ foreach “ definiert werden:
Und wie bei jedem anderen C++-Schleifenkonstrukt können Sie den Schleifenkörper einer „ foreach “-Schleife in geschweifte Klammern setzen und die Schleife mit „ break “ verlassen:
QList<QString> values;
//...
foreach (const QString&str, values) {
if (str.isEmpty())
break;
qDebug() << str;
}Mit QMap und QHash greift foreach automatisch auf die Wertkomponente der (Schlüssel, Wert)-Paare zu, daher sollten Sie values() nicht auf den Container anwenden (dies würde eine unnötige Kopie erzeugen, siehe unten). Wenn Sie sowohl über die Schlüssel als auch über die Werte iterieren möchten, können Sie Iteratoren verwenden (die schneller sind) oder die Schlüssel abrufen und diese nutzen, um auch die Werte zu erhalten:
QMap<QString, int> map;
//...
foreach (const QString&str, map.keys())
qDebug() << str << ':' << map.value(str);Für eine mehrwertige Abbildung gilt:
QMultiMap<QString, int> map;
//...
foreach (const QString&str, map.uniqueKeys()) {
foreach (int i, map.values(str))
qDebug() << str << ':' << i;
}Qt erstellt automatisch eine Kopie des Containers, wenn es in eine „ foreach “-Schleife eintritt. Wenn Sie den Container während der Iteration ändern, hat dies keine Auswirkungen auf die Schleife. (Auch wenn Sie den Container nicht ändern, wird dennoch eine Kopie erstellt; dank impliziter Freigabe erfolgt das Kopieren eines Containers jedoch sehr schnell.)
Da „foreach“ eine Kopie des Containers erstellt, können Sie den ursprünglichen Container nicht ändern, wenn Sie eine nicht-konstante Referenz für die Variable verwenden. Die Änderung wirkt sich nur auf die Kopie aus, was wahrscheinlich nicht Ihrem Wunsch entspricht.
Eine Alternative zu Qt’s ` foreach `-Schleife ist die bereichsbasierte ` for `, die Teil von C++11 und neueren Versionen ist. Beachten Sie jedoch, dass die bereichsbasierte ` for ` einen Qt-Container möglicherweise zum Trennen zwingt, während ` foreach ` dies nicht tut. Die Verwendung von ` foreach ` kopiert jedoch immer den Container, was bei STL-Containern in der Regel nicht gerade ressourcenschonend ist. Im Zweifelsfall sollten Sie für Qt-Container „ foreach “ und für STL-Container die bereichsbasierte „ for “ bevorzugen.
Sie können die Verfügbarkeit der Qt-Schleife „ foreach “ deaktivieren, indem Sie das Makro „ QT_NO_FOREACH “ definieren.
© 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.