如何将 QMap 存储到 QSetting 变量中

How to store a QMap into a QSetting variable

本文关键字:QSetting 变量 存储 QMap      更新时间:2023-10-16

我正在尝试使用QSettings在我的QT应用程序中保存一些设置。为此,我定义了一个类型:

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

之后我已经注册了它

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

问题出在哪里?谢谢!

您必须为QSession类型注册流运算符 - 请参阅 qRegisterMetaTypeStreamOperator。

QSettings可以序列化QVariants。由于您可以将QHash存储在QVariant中,因此我建议使用QHash而不是QMap。

http://doc.qt.io/qt-5/qvariant.html#QVariant-25 和 http://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.
}