Ok, I have just tested using the following code:

Qt Code:
  1. int id = QMetaType::type("QList<int>");
  2.  
  3. if (id == QMetaType::UnknownType) {
  4. std::cout << ">>> Unknown type!?" << std::endl;
  5. } else {
  6. QList<int> data = QList<int>() << 3 << 5 << 7;
  7. QList<int> readData = QList<int>();
  8.  
  9. QByteArray byteArray;
  10. QDataStream dataStream(&byteArray, QIODevice::WriteOnly);
  11. QDataStream readDataStream(&byteArray, QIODevice::ReadOnly);
  12.  
  13. QMetaType::save(dataStream, id, &data);
  14. QMetaType::load(readDataStream, id, &readData);
  15.  
  16. bool error = false;
  17.  
  18. if (data.size() != readData.size()) {
  19. std::cout << ">>> data.size() != readData.size()" << std::endl;
  20. std::cout << " " << data.size() << " vs. " << readData.size() << std::endl;
  21.  
  22. error = true;
  23. } else {
  24. for (int i = 0, iMax = data.size(); i < iMax; ++i)
  25. if (data[i] != readData[i]) {
  26. std::cout << ">>> data[" << i << "] != readData[" << i << "]" << std::endl;
  27. std::cout << " " << data[i] << " vs. " << readData[i] << std::endl;
  28.  
  29. error = true;
  30.  
  31. break;
  32. }
  33. }
  34.  
  35. if (!error)
  36. std::cout << ">>> Everything went fine..." << std::endl;
  37. }
To copy to clipboard, switch view to plain text mode 

and I got:

>>> Everything went fine...
on Windows, OS X and Linux. So, as far as I can tell, QMetaType::save/load works fine for my QList<int> type.