2010-03-16 13 views
11

Chcę zapisać QList<int> do mojego QSettings bez przechodzenia przez niego.
wiem, że mogę używać writeArray() i pętli, aby zapisać wszystkie przedmioty lub napisać qlist do QByteArray i zapisać to, ale to nie jest czytelny dla człowieka w moim pliku INI ..Zapisz QList <int> na QSettings

Obecnie używam następujące przekształcić mój QList<int> do QList<QVariant>:

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

i zbawić to QList<Variant> do moich ustawień używam następujący kod:

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

qlist jest poprawnie zapisany mój plik INI, jak widzę (przecinek rozdzielona lista moich int)
Ale funkcja zawiesza się przy wyjściu.
Próbowałem już użyć wskaźnika do moich QSettings obiekt zamiast ale potem wywala to na usuwanie wskaźnik ..

+0

Co nie rozumiem jest to, że w celu stworzenia ty 'QVariant' listy, którą za pośrednictwem pętli' int' liście, który właśnie ty staraj się unikać. Czy czegoś brakuje? – gregseth

+0

Nie. Pomyślałem, że mogę bezpośrednio zapisać mój QList , ale wydaje się, że działa tylko z QList .. Rzeczą, której chcę uniknąć, jest zapisanie listy za pomocą metody writeArray, ponieważ lista powinna być zapisana w innym poleceniu writeArray i Nie wiem, czy to zadziała .. – Tobias

+0

Uświadomiłem to teraz jako QString .. Zamiast pętli przez moje QList , aby utworzyć QList dołączam wartości do QString (oddzielone przecinkami), jak mi się podoba, aby pokazać je w Plik INI i na Wczytaj I dzielę ciąg (według ",") i ponownie twoją QList . – Tobias

Odpowiedz

16

QSettings :: setValue() wymaga QVariant jako drugiego parametru. Aby przekazać QList jako QVariant, musisz zadeklarować go jako Qt meta type. Oto fragment kodu, który pokazuje, jak zarejestrować się jako typ typu 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 .. Wiem jak to zrobić użyj metatypów, już ich używam. Ale jeśli zadeklaruję mój QList jako metatype i zapiszę go do moich ustawień, dane są zapisywane jako bytream .. oznacza, że ​​nikt nie może odczytać/zmienić go bezpośrednio w ini .. Ale nie ma awarii! :) – Tobias

1

Być może będziesz musiał się zarejestrować qlist jako meta typu własnej go do pracy. Jest to dobry punkt wyjścia do przeczytania meta-typów w Qt: http://qt.nokia.com/doc/4.6/qmetatype.html#details.

+0

Tak działa po zarejestrowaniu się jako metatype (chociaż jest zapisany jako bajttream) .. Ale nie ma błędu, kiedy przekazuję QList do setValue. Dlatego oczekuję, że to zadziała. A jeśli spojrzę na plik INI, lista zostanie zapisana jako przecinek oddzielony wartościami, tylko destruktor QList z jakiegoś powodu się zawiesza ... – Tobias