2010-03-16 9 views
11

Desidero salvare uno QList<int> in QSettings senza eseguire il looping.
So che potrei usare writeArray() e un ciclo di salvare tutti gli elementi o scrivere il QList ad un QByteArray e salvare questo, ma allora non è leggibile nel mio file INI ..Salva QList <int> in QSettings

Attualmente sto usando quanto segue per trasformare la mia 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)); 

E per salvare questo QList<Variant> ai miei Impostazioni io uso il seguente codice:

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

il QList è correttamente salvato il mio file INI come posso vedere (elenco separato virgola dei miei inti)
Ma la funzione si arresta in modo anomalo all'uscita.
Ho già provato a usare un puntatore ai miei QSettings oggetto, invece, ma poi si blocca su come cancellare il puntatore ..

+0

Quello che non capisco è che, al fine di creare voi 'QVariant' elenco che si ciclo attraverso la vostra lista' int', che proprio voi cerca di evitare. Mi sto perdendo qualcosa? – gregseth

+0

No .. Ho pensato di poter salvare direttamente la mia QList ma sembra funzionare solo con QList .. La cosa che voglio evitare è salvare l'elenco con writeArray, perché l'elenco dovrebbe essere scritto all'interno di un altro comando writeArray e Non so se questo potrebbe funzionare .. – Tobias

+0

L'ho capito ora come QString .. Invece di scorrere il mio QList per creare un QList Appendo i valori a un QString (virgola separata) come mi piace che venga mostrato in File INI e su Carica ho diviso lo String (con ',') e creato di nuovo il mio QList . – Tobias

risposta

16

QImpostazioni :: setValue() richiede QVariant come secondo parametro. Per passare QList come QVariant, devi dichiararlo come Qt meta type. Ecco il frammento di codice che dimostra come registrare un tipo come meta Tipo:

#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 .. So come usa i metatipi, li sto già usando. Ma se dichiaro il mio QList come metatype e lo salviamo nelle mie impostazioni, i dati vengono salvati come da testream .. significa che nessuno può leggerli/modificarli direttamente in ini .. Ma non si verifica un arresto anomalo !! :) – Tobias

1

Potrebbe essere necessario registrarsi QList come un meta-tipo di un proprio per farlo funzionare. Questo è un buon punto di partenza per leggere i meta-tipi in Qt: http://qt.nokia.com/doc/4.6/qmetatype.html#details.

+0

Sì, sta funzionando dopo essersi registrato come metatype (sebbene sia salvato come un filmato) .. Ma non c'è errore, quando passo QList a setValue. Quindi mi aspetto che funzioni. E se guardo il file INI, l'elenco viene salvato con una virgola separata con i valori al suo interno, solo il distruttore di QList si arresta per qualche motivo ... – Tobias