Как объяснено в документации Универсальные контейнеры Qt :
Qt автоматически берет копию контейнера, когда он входит в цикл foreach. Если вы измените контейнер во время итерации, это не повлияет на цикл. (Если вы не изменяете контейнер, копирование по-прежнему происходит, но благодаря неявному совместному использованию копирование контейнера выполняется очень быстро.) Аналогичным образом, объявление переменной как неконстантной ссылки для изменения текущего элемента в список также не будет работать.
Он делает копию, потому что вы можете удалить элемент из списка или добавить элементы, например, во время цикла. Недостатком является то, что ваш вариант использования не будет работать. Вместо этого вам придется перебирать список:
for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) {
(*i) += "s";
}
Немного больше печатать, но не слишком много.