А кто сказал, что читается int?
Чтение происходит из потока, где содержатся
просто байты, а уж потом прочитанное приводится к int посредством вызова v.toInt(). Кроме того, конструктор QVariant вызывается с int. Если смущает typeName, который выдает int, то вот что говорит Assistant:
const char * QVariant::typeName () const
Returns the name of the type stored in the variant. The returned strings describe the C++ datatype used to store the data: for example, "QFont", "QString", or "QValueList". An Invalid variant returns 0.
В этом случае выдается базовый тип языка - int.