Хотя вот мне лично главная проблема видится в следующем:
"чтобы
qint64 занимал в QByteArray именно
4 байта"
qint64 будет всегда и везде занимать 8 байт (64 бита / 8 бит).
Иначе, это уже не qint64. Это qint32.
Запись qint32 в QByteArray гарантирует размещение всех 4 байт.
Зачем пляски с бубнами вокруг неправильной задачи?