Попробуйте с объявлением mmf const:
const unsigned char* mmf = file.map(0, size);
, а затем посмотрите на векторы QImage, особенно
QImage( const uchar*, int width, int height, Format )
QImage :: QImage (const uchar * data, int width, int height, Format format)
В документах сказано:
"Буфер должен оставаться действительным в течение всего жизненного цикла QImage, и все копии, которые не были изменены или иным образом отделены от исходного буфераИзображение не удаляет буфер при уничтожении. [...] В отличие от аналогичного конструктора QImage, который принимает неконстантный буфер данных, эта версия никогда не изменит содержимое буфера. Например, вызывая QImage :: bits () вернет глубокую копию изображения, а не буфер, переданный конструктору. Это обеспечивает эффективность построения QImage из необработанных данных без возможности изменения необработанных данных. "
Примечаниечто неконстантная версия uchar * копирует сразу, поэтому обязательно передайте const uchar *.Также обратите внимание, что вызов неконстантных методов QImage скопирует данные.