Russian Qt Forum

Qt => Общие вопросы => Тема начата: finka от Сентябрь 19, 2007, 12:01



Название: Пример из Assistant'a
Отправлено: finka от Сентябрь 19, 2007, 12:01
Пример взят из описания класса QVariant:

Код:
QDataStream out(...);
QVariant v(123);                // The variant now contains an int
int x = v.toInt();                // x = 123
out << v;                          // Writes a type tag and an int to out
v = QVariant("hello");          // The variant now contains a QByteArray
v = QVariant(tr("hello"));      // The variant now contains a QString
int y = v.toInt();               // y = 0 since v cannot be converted to an int
QString s = v.toString();       // s = tr("hello")  (see QObject::tr())
out << v;                         // Writes a type tag and a QString to out
...
QDataStream in(...);            // (opening the previously written stream)
in >> v;                        // Reads an Int variant
int z = v.toInt();              // z = 123
qDebug("Type is %s",            // prints "Type is int"
        v.typeName());
v = v.toInt() + 100;            // The variant now hold the value 223
v = QVariant(QStringList());

Кто-нибудь, объясните, пожалуйста, почему в v из in читается именно значение типа int?


Название: Re: Пример из Assistant'a
Отправлено: Hellraiser от Сентябрь 19, 2007, 12:09
А кто сказал, что читается 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.


Название: Re: Пример из Assistant'a
Отправлено: finka от Сентябрь 19, 2007, 12:19
Тогда откуда v известно, сколько байт из потока читать?
И что значит "Writes a type tag and an int to out"? Что еще кроме самого числа пишется в out?
Непоняяятно...


Название: Re: Пример из Assistant'a
Отправлено: pastor от Сентябрь 19, 2007, 12:19
Кто-нибудь, объясните, пожалуйста, почему в v из in читается именно значение типа int?

А что собственно говоря должно считываться? Есть в коде такой комментарий "opening the previously written stream". А в предыдущий поток ты что писал: сначало число типа int (123), затем строку QString. Вот первым мы исчитали значение типа int. За более подробной информацией обращайся к ассистанту - см. QDataStream.


Название: Re: Пример из Assistant'a
Отправлено: pastor от Сентябрь 19, 2007, 12:30
Вот, посмотрите вот этот раздел в ассистанте: Format of the QDataStream Operators. В таблице представлены все типы поддерживаемые QDataStream а также их способ записис в поток. Все вопросы должны отпасть сми собой.

Код:
QVariant

The type of the data (quint32)
The null flag (qint8)
The data of the specified type


Название: Re: Пример из Assistant'a
Отправлено: finka от Сентябрь 19, 2007, 12:37
Спасибо, теперь понятно.