2009-09-13 18 views
6

io penso posso scrivere una QObject come questo sfruttando le Q_PROPERTY s:lettura QObject/scrittura

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; 
} 

Il che, se questo è vero, non so il motivo per cui non lo fanno QObject s il metodo è già implementato perché è piuttosto generico. Ma questo è oltre il punto. Come leggerei il file? cioè, implementa questa funzione?

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

Sto pensando che posso usare in qualche modo ds.readBytes ma come faccio a ottenere la lunghezza della proprietà?

PS: Se non era ovvio, Object è la mia classe personalizzata che eredita da QObject.

+2

Non penso che QObjects debba essere serializzabile. Non puoi nemmeno copiarli. Per quanto riguarda la lettura di QVariant, è molto semplice (basta leggerlo con >> in QVariant vuoto), o difficile - devi gestire da solo il tipo e la lunghezza. – Eugene

+0

Se stai cercando la serializzazione, potresti dare un'occhiata a Boost.Serialize. –

+0

@Eugene: Avrebbe dovuto postare quella risposta ... per qualche ragione non mi è venuto in mente che potevo leggere nel 'QVariant'. Ho pensato che sarebbero stati tutti di dimensioni diverse o qualcosa del genere, ma non è così che funziona il C++. – mpen

risposta

5

Questo sembra funzionare.

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; 
} 

Grazie a Eugene.