2010-03-16 353 views
11

我想将QList<int>保存到我的QSettings中,但不循环。
我知道,我可以使用writeArray()和一个循环保存所有的项目或写的QList到的QByteArray和保存这一点,但那就不是人类可读在我的INI文件..将QList <int>保存到QSettings

目前我使用下面以改变我QList<int>QList<QVariant>

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

,并保存这个QList<Variant>我的设置我用下面的代码:

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

的QList作正确保存到我的INI文件,因为我可以看到(逗号分隔我的整数列表)
但该函数在退出时崩溃。
我已经尝试过使用指向我的QSettings对象的指针,但随后它在删除指针时崩溃了。

+0

我不明白的是,为了创造你'QVariant'列出你通过你的'int'列表循环,这正是你尽量避免。我错过了什么吗? – gregseth 2010-03-16 09:08:34

+0

没有..我以为我可以直接保存我的QList ,但它似乎只适用于QList ..我想避免的是用writeArray保存List,因为列表应该写入另一个writeArray命令中,并且我不知道这是否会工作.. – Tobias 2010-03-16 10:51:02

+0

我现在意识到它作为一个QString ..而不是循环通过我的QList 创建一个QList 我追加到一个QString值(逗号分隔),因为我喜欢它显示在INI文件和加载我分割字符串(','),并再次创建我的QList 。 – Tobias 2010-03-18 09:09:22

回答

16

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

#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; 
} 
+0

嗯..我知道如何使用元类型,我已经使用它们。但是,如果我将QList 声明为元类型并将其保存到我的设置中,则数据将保存为bytestream ..意味着没有人可以直接在ini中读取/更改它..但不会发生崩溃! :) – Tobias 2010-03-16 12:18:16

1

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

+0

是的,它注册为一个元类型后(虽然它被保存为一个字节流)..但是没有错误,当我通过一个QList setValue。因此,我期望它的工作..而如果我看看INI文件,列表中保存的逗号与它的值分开,只有QList的析构函数崩溃,出于某种原因... – Tobias 2010-03-17 08:42:29