2016-03-04 15 views
0

我正在尝试使用QSettings在我的QT App中保存一些设置。对于我已经定义了一个类型:如何将QMap存储到QSetting变量中

typedef QMap 
    < 
    QString, 
    QMap<QString, QVariant> 
    > 
QSession; 

之后,我有registred它

Q_DECLARE_METATYPE(QSession); 

创造一些条目并阅读它们在运行后,使没有问题,但我得到了如下因素错误关闭应用

QVariant::save: unable to save type 'QSession' (type id: 1067). 

我节省,功能看起来像

void saveSession() 
{ 
    QSession session; 

    for(auto it = pool.begin(); it != pool.end(); ++it) 
    { 
     QString hash(toQString((*it).getHash())); 

     session[hash]["name"] = toQVariant(toQString((*it).getName())); 
     session[hash]["size"] = toQVariant((*it).getSize()); 
     session[hash]["timeout"] = toQVariant((*it).getTimeout()); 
    } 

    this->settings.setValue("session", QVariant::fromValue(session)); 
} 

问题在哪里?谢谢!

回答

1

QSettings可以序列化QVariants。正如你可以将QHash存储在QVariant中,我建议使用QHash而不是QMap。

http://doc.qt.io/qt-5/qvariant.html#QVariant-25http://doc.qt.io/qt-5/qvariant.html#toHash

void saveSession() 
{ 
    QHash<QString,QVariant> session; 

    for(auto it = pool.begin(); it != pool.end(); ++it) 
    { 
     QString hash(toQString((*it).getHash())); 

     QHash<QString, QVariant> tmp; 
     tmp[ "name" ] = toQVariant(toQString((*it).getName())); 
     tmp[ "size" ] = toQVariant((*it).getSize()); 
     tmp[ "timeout" ] = toQVariant((*it).getTimeout()); 

     session.insert(hash, QVariant(tmp)); 
    } 

    this->settings.setValue("session", session); 
} 

此代码是未经测试,但我想它应该做你所期望的。要获得QSettings对象的值,您可以执行以下操作:

QHash<QString, QVariant> session = settings.value("session").toHash(); 
for(...) 
{ 
    QHash<QString,QVariant> data = iterator.value().toHash(); 
    // do whatever you want with data[ "name" ] etc. 
}