2010-03-16 8 views
11

반복하지 않고 QList<int>을 내 QSettings에 저장하고 싶습니다. QList <int>을 QSettings에 저장

은 현재 내가 사용하고 ..
는 내가 모든 항목을 저장 writeArray()와 루프를 사용할 수 있습니다 또는 QByteArray에 QList를 작성하고이를 저장하는 것이 알고 있지만 그것은 내 INI 파일에 사람이 읽을 수없는 변환하려면 다음을 내 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 파일을 볼 수 있습니다 (쉼표로 구분 된 내 int 목록)
하지만 종료 할 때 함수가 충돌합니다.
이미 내 QSettings 개체에 대한 포인터를 대신 사용하려고 시도했지만 포인터 삭제시 충돌이 발생합니다.

+0

내가하지 않는 것은 당신이'당신'int' 목록을 당신에게 루프를 나열 QVariant' 만들기 위해에있는 정확하게 피하려고 노력하다. 내가 놓친 게 있니? – gregseth

+0

아니요 .. 내 QList 을 직접 저장할 수 있다고 생각했지만 QList 에서만 작동하는 것 같습니다. writeArray를 사용하여 List를 저장하는 것은 목록이 다른 writeArray 명령 내에 작성되어야하므로 이게 작동하는지 모르겠다. – Tobias

+0

QString으로 지금 깨달았다. QList를 만들려면 을 반복한다. QString (쉼표로 구분)에 값을 추가한다. INI 파일 및로드 할 때 문자열을 '(,'로) 분할하고 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

관련 문제