2010-03-16 3 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, как я могу видеть (разделенный запятой список моих ints)
Но функция вылетает при выходе.
я уже пытался использовать указатель на мой QSettings объект, но вместо этого, то он выходит из строя при удалении указателя ..

+0

То, что я не получаю, что для того, чтобы создать вы 'QVariant' список вам цикл через' int' список, который точно вы попытайся избежать. Я что-то упускаю? – gregseth

+0

Нет. Я подумал, что могу напрямую сохранить свой QList , но он работает только с QList .. Я хочу избежать сохранения списка с помощью writeArray, потому что список должен быть написан в другой команде writeArray и Я не знаю, будет ли это работать. – Tobias

+0

Я понял это сейчас как QString .. Вместо того, чтобы перебирать QList для создания QList Я добавляю значения в QString (разделенный запятой), поскольку мне нравится, чтобы он отображался в INI, а на Load я разделяю String (по ',') и снова создаю свой QList . – Tobias

ответ

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

1

Вы, возможно, придется зарегистрировать QList как мета-тип своей собственной для его работы. Это хорошая отправная точка для чтения мета-типов в Qt: http://qt.nokia.com/doc/4.6/qmetatype.html#details.

+0

Да, он работает после регистрации в виде метатипа (хотя он сохраняется как байтовый поток). Но нет ошибки, когда я передаю QList в setValue. Поэтому я ожидаю, что это сработает. И если я посмотрю на INI-файл, список будет сохранен в запятой, разделенном со значениями в нем, только деструктор QList сбой по какой-то причине ... – Tobias

Смежные вопросы