2009-09-13 14 views
6

Yo creo Puedo escribir una QObject como esto mediante el aprovechamiento de las Q_PROPERTY s:lectura QObjects/escritura

QDataStream &operator<<(QDataStream &ds, const Object &obj) { 
    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { 
     if(obj.metaObject()->property(i).isStored(&obj)) { 
      ds << obj.metaObject()->property(i).read(&obj); 
     } 
    } 
    return ds; 
} 

Lo cual, si eso es cierto, no sé por qué no lo hacen s QObject ya tiene implementado ese método porque es bastante genérico. Pero eso es además del punto. ¿Cómo leería el archivo? es decir, ¿implementar esta función?

QDataStream &operator>>(QDataStream &ds, Object &obj) { 
    return ds; 
} 

Estoy pensando en alguna manera puedo usar ds.readBytes pero ¿cómo iba a obtener la longitud de la propiedad?

PD: Si no fue obvio, Object es mi clase personalizada que hereda de QObject.

+2

No creo que se suponga que QObjects sea serializable. Ni siquiera puedes copiarlos. En cuanto a leer QVariant, es muy fácil (solo léalo con >> en QVariant vacío), o difícil: debe manejar el tipo y la longitud usted mismo. – Eugene

+0

Si está buscando la serialización, es posible que desee consultar Boost.Serialize. –

+0

@Eugene: Debería haber publicado eso como una respuesta ... por alguna razón no se me ocurrió que podía leer en el 'QVariant'. Pensé que serían de diferentes tamaños o algo así, pero así no es como funciona C++. – mpen

Respuesta

5

Esto parece funcionar.

QDataStream &operator>>(QDataStream &ds, Object &obj) { 
    QVariant var; 
    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) { 
     if(obj.metaObject()->property(i).isStored(&obj)) { 
      ds >> var; 
      obj.metaObject()->property(i).write(&obj, var); 
     } 
    } 
    return ds; 
} 

Gracias a Eugene.