Najważniejsze to zrozumieć do czego służy QDataStream!
A służy on do jednolitego zapisu danych binarnych niezależnie od stosowanej platformy. Chodzi o utrzymanie spójności danych, które moga być przenoszone pomiędzy platformami o różnej architekturze.
Przykładowo ARM używa BIG ENDIAN a x86 LITTLE ENDIAN, więc zapis int-a bez tej klasy będzie wyglądał inaczej!
To samo się dotyczy zapisu liczb zmiennoprzecinkowych, które na innych architekturach mogą mieć inny standard.
A teraz co do samego tematu. Najprościej stosować QList lub QVector, wtedy zapis tych danych idzie automatycznie (szablony obsługą iterowanie i zapis rozmiaru).
Jeśli jednak chcesz mieć tablicę O STAŁYM ROZMIARZE (danym raz na zawsze dla wszystkich wersji programu), to po prosty iterujesz po tablicy i zapisujesz dane operatorem << element po elemencie.
cont int SIZE_X = 4;
cont int SIZE_Y = 100;
double tabl[SIZE_Y][SIZE_X];
...
for(int i=0; i<SIZE_Y; ++i)
for(int j=0; j<SIZE_Y; ++j)
dataStream << (qint32) tabl[i][j];
Jeśli nie chcesz stałej wielkości to po prostu, zapisujesz najpierw rozmiar danych.
edit: zapomniałem dodać obowiązkowego castowania dla sprecyzowania rozmiaru (poprawiłem w kodzie).