2009-09-13 27 views
6

私は私はQ_PROPERTY Sを利用することによって、このようなQObjectを書くことができると思い読み取り/書き込みのQObject

それが本当ならばQObject sがない理由、私にはわからない、
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; 
} 

をそれはかなり一般的なので、すでに実装されているメソッドを持っています。しかし、それはポイントのほかにあります。どのようにファイルを読むのですか?すなわち、この機能を実装するか?

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

私は何とかds.readBytesを使用することができますが、どのように私は、プロパティの長さになるだろうと思っていますか?

PS:明らかでない場合、ObjectQObjectを継承する私のカスタムクラスです。

+2

QObjectがシリアライズ可能であるとは思われません。あなたはそれらをコピーすることさえできません。 QVariantを読み返すのは、非常に簡単です(空のQVariantに>>を読み込むだけです)、またはハードです - タイプと長さを自分で処理する必要があります。 – Eugene

+0

シリアライゼーションをお探しの場合は、Boost.Serializeを見てください。 –

+0

@Eugene:答えとして投稿しておかなければならない...何らかの理由で、私が 'QVariant'で読むことができなかったということは私には起こりませんでした。私は彼らがすべて異なるサイズや何かになると思っていましたが、それはC++の仕組みではありません。 – mpen

答えて

5

これは動作するようです。

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

Eugeneのおかげです。

関連する問題