2010-03-16 11 views
11

Quiero guardar un QList<int> en mi QSettings sin recorrerlo.
sé que podría utilizar writeArray() y un bucle para guardar todos los artículos o para escribir el QList a un QByteArray y guardar esto, pero entonces no es legible en mi archivo INI ..Guardar QList <int> en QSettings

Actualmente estoy usando lo siguiente para transformar mi QList<int> a QList<QVariant>:

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

Y para guardar esta QList<Variant> a mi configuración que uso el siguiente código:

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

el QList se guarda correctamente a mi archivo INI como puedo ver (lista separada por comas de mis datos)
Pero la función falla al salir.
ya traté de usar un puntero a mis QSettings objeto en su lugar, pero luego se estrella sobre la supresión del puntero ..

+0

Lo que no entiendo es que con el fin de crear que 'QVariant' que la lista de bucle a través de su lista de' int', que precisamente se tratar de evitar. ¿Me estoy perdiendo de algo? – gregseth

+0

No .. Pensé que puedo guardar directamente mi QList pero parece que solo funciona con QList .. Lo que quiero evitar es guardar la lista con writeArray, porque la lista debe escribirse dentro de otro comando writeArray y No sé si esto funcionaría ... – Tobias

+0

Me di cuenta ahora como un QString .. En lugar de recorrer mi QList para crear una QList adjunto los valores a un QString (separado por comas) como me gustaría que se muestre en Archivo INI y en Carga, divido la Cadena (por ',') y creo mi QList nuevamente. – Tobias

Respuesta

16

QSettings :: setValue() necesita QVariant como un segundo parámetro. Para pasar QList como QVariant, debe declararlo como Qt meta type. He aquí el fragmento de código que muestra cómo registrar un tipo que en meta:

#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

Hmm ... Sé cómo usar metatipos, ya los estoy usando. Pero si declaro mi QList como metatipo y la guardo en mi configuración, los datos se guardan como bytestream ... significa que nadie puede leerlos/cambiarlos directamente en el ini ... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡No se produce ningún fallo !! :) – Tobias

1

Es posible que tenga que registrarse QList como un meta-tipo de su propia para que funcione. Este es un buen punto de partida para leer los meta-tipos en Qt: http://qt.nokia.com/doc/4.6/qmetatype.html#details.

+0

Sí, está funcionando después de registrarse como metatipo (aunque se guarda como un bit de reproducción). Pero no hay ningún error cuando paso un QList a setValue. Por lo tanto, espero que funcione ... Y si miro el archivo INI, la lista se guarda en coma separada con los valores que contiene, solo el destructor de la QList falla por algún motivo ... – Tobias

Cuestiones relacionadas