2010-03-16 354 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文件,因爲我可以看到(逗號分隔我的整數列表)
但該函數在退出時崩潰。
我已經嘗試過使用指向我的QSettings對象的指針,但隨後它在刪除指針時崩潰了。

+0

我不明白的是,爲了創造你'QVariant'列出你通過你的'int'列表循環,這正是你儘量避免。我錯過了什麼嗎? – gregseth 2010-03-16 09:08:34

+0

沒有..我以爲我可以直接保存我的QList ,但它似乎只適用於QList ..我想避免的是用writeArray保存List,因爲列表應該寫入另一個writeArray命令中,並且我不知道這是否會工作.. – Tobias 2010-03-16 10:51:02

+0

我現在意識到它作爲一個QString ..而不是循環通過我的QList 創建一個QList 我追加到一個QString值(逗號分隔),因爲我喜歡它顯示在INI文件和加載我分割字符串(','),並再次創建我的QList 。 – Tobias 2010-03-18 09:09:22

回答

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 2010-03-16 12:18:16

1

您可能必須註冊QList作爲它自己的元類型才能工作。這是閱讀Qt中的元類型的好起點:http://qt.nokia.com/doc/4.6/qmetatype.html#details

+0

是的,它註冊爲一個元類型後(雖然它被保存爲一個字節流)..但是沒有錯誤,當我通過一個QList setValue。因此,我期望它的工作..而如果我看看INI文件,列表中保存的逗號與它的值分開,只有QList的析構函數崩潰,出於某種原因... – Tobias 2010-03-17 08:42:29