0

私は を持っていますがQHash<const QString id, MyClass>、MyClass は getter と setter を持ついくつかの QString quint8 値の単なるコレクションです。MyClass にもQDataStream &operator<<(QDataStream &ds, const MyClass &obj)上書きがあります。

シリアル化するには、次を使用します。

typedef QHash<const QString, MyClass> MyClassHash;
//..
QDataStream &operator<<(QDataStream &ds, const MyClassHash &obj) {

    QHashIterator<const QString, MyClass> i(obj);

    while(i.hasNext())
    {
        i.next();
        QString cKey = i.key();
        ds << cKey << i.value();
    }

    return ds;
}

今、私は他のものと混同しています:

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
    obj.clear();

    // ?    

    return ds;
}

そのシリアル化された QHash の長さを知っていますか?

4

3 に答える 3

1

and for QHash を提供しません。それらの実装は、Qt によって既に提供されています。operator<<operator>>

キーの型と値の型の両方が QDataStream を使用してシリアライズ可能である限り、問題ありません。

class MyClass
{
    int i;
    friend QDataStream &operator<<(QDataStream &ds, const MyClass &c);
    friend QDataStream &operator>>(QDataStream &ds, MyClass &c);
};

QDataStream &operator<<(QDataStream &ds, const MyClass &c)
{
    ds << c.i;
    return ds;
}
QDataStream &operator>>(QDataStream &ds, MyClass &c)
{
    ds >> c.i;
    return ds;
}

int main() 
{
    QHash<QString, MyClass> hash;
    QDataStream ds;
    // doesn't do anything useful, but it compiles, showing you
    // that you don't need any custom streaming operators
    // for QHash
    ds << hash;
    ds >> hash;
}
于 2015-10-26T18:51:26.267 に答える
1

QDataStream ::status について:

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
  obj.clear(); // clear possible items

  Myclass cMyCls;

  while (!ds.status()) { // while not finished or corrupted
    ds >> cKey >> cMyCls;
    if (!cKey.isEmpty()) { // prohibits the last empty one
      obj.insert(cKey, cMyCls);
    }
  } 

  return ds;
}
于 2015-10-26T17:57:07.140 に答える
0

明らかに、物事を行うには2つの方法があります。

  1. QHashoperator<<のアイテムを保存する前に、QHash::size を保存する必要があります
  2. operator<<空の QString などの無効な QStringを保存しoperator>>、そのような値に達したら読み取りを停止します。
于 2015-10-26T11:28:32.293 に答える