2009-11-16 2 views
1

J'ai un QList de QLineEdit * 'sSauvegarde QListe <T> dans un fichier?

QList<QLineEdit*> example; 

Exemple détiendra 100 articles de lineEdits.

Lorsque j'essaie d'enregistrer ou de charger un fichier, il ne parvient pas à enregistrer ou charger le QList correctement, voire pas du tout. Je reçois un nombre de données beaucoup plus faible que prévu.

Je vois à la page here qu'il ya l'opérateur correct des ressources de QList<T> pour < < & >>, mais je ne peux pas sembler les amener à enregistrer dans un fichier en utilisant QDataStream

J'ai aussi J'ai essayé de copier toutes les valeurs "text()" de LineEdits dans une liste de chaînes séparée mais je ne peux toujours pas les enregistrer dans un fichier. Toute aide serait appréciée.

EDIT: On dirait que ça l'a fait. C'est comme ça que je les relis, y a-t-il une approche plus simple, ou est-ce que je l'ai à peu près couvert?

//memoryAddresses 
    for(int i = 0; i < 100; i++) 
    { 
     QString temp; 
     loadFile >> temp; 
     memAddr.at(i)->setText(temp); 
    } 
+1

Pour modifier, j'espère que ce n'est pas exactement comment vous le faites. Ce que cela ressemble à moi, c'est que vous déclarez un pointeur sur un QString, alors que ce devrait être un QString directement. –

Répondre

5

QList<QLineEdit*> est une liste de pointeurs (INTS essentiellement, donc si vous écrivez que dans un fichier que vous n'obtiendrez pas beaucoup d'informations utiles.

La méthode text() devrait faire ce que vous recherchez.

foreach(const QLineEdit* le, example) 
{ 
    if(le) 
    { 
    ds << le->text(); 
    } 
} 

Notez les différences entre displayText et text

Pour relues.

Si vous travaillez uniquement avec des chaînes, la classe QTextStream est un peu plus agréable à utiliser (peut également être utilisé ci-dessus plutôt que le QDataStream ... pour être cohérent, même si vous devez utiliser le même type de flux pour lire et écrire). Je ne suis pas en mesure de tester ce code au moment, mais vous pouvez essayer quelque chose comme ceci:

QList<QLineEdit*> example; 
while(!stream.atEnd()) 
{ 
    QString str; 
    stream >> str; 
    if(stream.isNull()) 
    break; 
    QLineEdit* le = new QLineEdit(); 
    le->setText(str); 
    example.append(le); 
} 
+0

@Jesse Il semble que cela a bien fonctionné. Je suppose que je devrais lire les QStrings dans un autre tableau et ensuite recopier? Sauf s'il y a une approche plus simple – bobby

1

L'objet chaîne n'est pas affectée par le flux. Utilisez un objet QString au lieu d'un pointeur.

//memoryAddresses 
for(int i = 0; i < 100; i++) 
{ 
    QString temp; 
    loadFile >> temp; 
    memAddr.at(i)->setText(temp); 
} 

Ou vous pouvez écrire vos propres fonctions QLineEdit streaming

QDataStream& operator<<(QDataStream& stream, const QLineEdit& lineEdit) 
{ 
    const qint32 version(0); 
    stream << version; 
    stream << lineEdit.text(); 
    //... whatever you want from the lineedit 
} 

QDataStream& operator>>(QDataStream& stream, const QLineEdit& lineEdit) 
{ 
    qint32 version(0); 
    QString text; 
    stream >> version; 
    Q_ASSERT_X(version, __FUNCSIG__, "Wrong line edit version"); 
    stream >> text; 
    lineEdit.setText(text); 
    //... whatever you want from the stream 
} 


// write to stream 
foreach(const QLineEdit* le, example) 
{ 
    if(le) 
    { 
    ds << *le; 
    } 
} 

// read from stream 
foreach(const QLineEdit* le, example) 
{ 
    if(le) 
    { 
    ds >> *le; 
    } 
} 
Questions connexes