【问题标题】:Save QList<int> to QSettings将 QList<int> 保存到 QSettings
【发布时间】:2011-01-28 00:22:42
【问题描述】:

我想将QList&lt;int&gt; 保存到我的 QSettings 而不循环它。
我知道我可以使用 writeArray() 和一个循环来保存所有项目或将 QList 写入 QByteArray 并保存它,但是在我的 INI 文件中它不是人类可读的..

目前我正在使用以下方法将我的QList&lt;int&gt; 转换为QList&lt;QVariant&gt;

QList<QVariant> variantList;
//Temp is the QList<int>
for (int i = 0; i < temp.size(); i++)
  variantList.append(temp.at(i));

为了将这个 QList&lt;Variant&gt; 保存到我的设置中,我使用以下代码:

QVariant list;
list.setValue(variantList);
//saveSession is my QSettings object
saveSession.setValue("MyList", list);

如我所见,QList 已正确保存到我的 INI 文件中(我的整数的逗号分隔列表)
但该函数在退出时崩溃。
我已经尝试使用指向我的 QSettings 对象的指针,但是它在删除指针时崩溃..

【问题讨论】:

  • 我不明白的是,为了创建您的 QVariant 列表,您需要遍历您的 int 列表,而这正是您试图避免的。我错过了什么吗?
  • No .. 我认为我可以直接保存我的 QList 但它似乎只适用于 QList .. 我要避免的事情是用 writeArray 保存列表,因为列表应该写在另一个 writeArray 命令中,我不知道这是否可行..
  • 我现在意识到它是一个 QString.. 而不是循环通过我的 QList 来创建一个 QList 我将值附加到一个 QString(逗号分隔),因为我喜欢它显示在 INI 文件中并在加载时拆分字符串(按“,”)并再次创建我的 QList

标签: qt qlist


【解决方案1】:

QSettings::setValue() 需要 QVariant 作为第二个参数。要将 QList 作为 QVariant 传递,您必须将其声明为 Qt meta type。这是演示如何将类型注册为元类型的代码 sn-p:

#include <QCoreApplication>
#include <QDebug>
#include <QMetaType>
#include <QSettings>
#include <QVariant>

Q_DECLARE_METATYPE(QList<int>)

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qRegisterMetaTypeStreamOperators<QList<int> >("QList<int>");

    QList<int> myList;
    myList.append(1);
    myList.append(2);
    myList.append(3);

    QSettings settings("Moose Soft", "Facturo-Pro");
    settings.setValue("foo", QVariant::fromValue(myList));
    QList<int> myList2 = settings.value("foo").value<QList<int> >();
    qDebug() << myList2;

    return 0;
}

【讨论】:

  • 嗯.. 我知道如何使用元类型,我已经在使用它们了。但是,如果我将我的 QList 声明为元类型并将其保存到我的设置中,则数据将保存为字节流.. 意味着没有人可以直接在 ini 中读取/更改它.. 但不会发生崩溃! :)
【解决方案2】:

您可能必须将 QList 注册为它自己的元类型才能使其工作。这是阅读 Qt 中元类型的一个很好的起点:http://qt.nokia.com/doc/4.6/qmetatype.html#details

【讨论】:

  • 是的,它在注册为元类型后工作(尽管它保存为字节流)。但是当我将 QList 传递给 setValue 时没有错误。因此我希望它能够工作。如果我查看 INI 文件,列表保存为逗号与其中的值分隔,只有 QList 的析构函数因某种原因崩溃......
【解决方案3】:

我也在为此苦苦挣扎……我相信我现在有一个不错的解决方案。

我希望这可以为某人省去麻烦,它造成了我。

#include <QCoreApplication>
#include <QSettings>
#include <QList>
#include <QDataStream>
#include <QVariant>
#include <QVariantList>
#include <QDebug>
#include <deque>


template <class T> static QVariant toVariant(const QList<T> &list)
{
    QVariantList variantList;
    variantList.reserve(list.size());
    for (const auto& v : list)
    {
        variantList.append(v);
    }
    return variantList;
}

template <class T> static QList<T> toList(const QVariant &qv)
{
    QList <T> dataList;
    foreach(QVariant v, qv.value<QVariantList>()) {
        dataList << v.value<T>();
    }
    return dataList;
}



void Gen()
{
    QList<QString> data {"hello", "world","how", "are", "you"};
    QList<int> ages {10,20,30,40};
    QSettings setup("stuff.ini", QSettings::IniFormat);
    setup.beginWriteArray("rules");
    for (int groups=0;groups<3;groups++)
    {
        setup.setArrayIndex(groups);
        setup.setValue("rule",QString("Rule-%1").arg(groups));
        setup.setValue("data", toVariant (data));
        setup.setValue("ages", toVariant (ages));
    }
    setup.endArray();
    setup.sync();
}


void Read()
{
    QSettings setupR("stuff.ini", QSettings::IniFormat);
    int rule_count = setupR.beginReadArray("rules");
    for (int groups=0;groups<rule_count;groups++)
    {
        setupR.setArrayIndex(groups);

        QString nameRead = setupR.value("rule").toString();
        QList<QString> dataRead =  toList<QString>(setupR.value("data"));
        qDebug() << "Rule " << groups;
        qDebug() << "Rule Read" << nameRead;
        qDebug() << "Data Read2" << dataRead;
    }

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // Write
    Gen();
    // Read
    Read();
    exit(0);
    //return a.exec();
}

你应该得到一个看起来像这样的 INI 文件......

[rules]
1\ages=10, 20, 30, 40
1\data=hello, world, how, are, you
1\rule=Rule-0
2\ages=10, 20, 30, 40
2\data=hello, world, how, are, you
2\rule=Rule-1
3\ages=10, 20, 30, 40
3\data=hello, world, how, are, you
3\rule=Rule-2
size=3

这里的好处是您可以在 QT 之外编辑它(请小心)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多