Сохранение QList <T>в файл? - PullRequest
       25

Сохранение QList <T>в файл?

1 голос
/ 17 ноября 2009

У меня есть QList из QLineEdit * 's

QList<QLineEdit*> example;

Пример будет содержать 100 элементов lineEdits.

Когда я пытаюсь сохранить или загрузить файл, он не может правильно сохранить или загрузить QList, если он вообще существует. Я получаю намного меньше, чем ожидалось, количество данных.

Я вижу на странице ресурсов QList<T> здесь , что есть правильный оператор для << & >>, Однако я не могу заставить их сохранить в файл, используя QDataStream

Я также пытался скопировать все значения "text ()" из LineEdits в отдельный список строк, но я все еще не могу сохранить их в файл. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Похоже, что сделал это. Вот как я их читаю, есть ли более простой подход к этому, или я в значительной степени раскрыл это?

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

Ответы [ 2 ]

5 голосов
/ 17 ноября 2009

QList<QLineEdit*> - это список указателей (в основном, целых, поэтому, если вы напишите это в файл, вы не получите много полезной информации.

Метод text() должен делать то, что вы ищете.

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

Обратите внимание на различия между displayText и text .

Читать обратно:

Если вы работаете только со строками, класс QTextStream немного удобнее в использовании (его также можно использовать выше, чем QDataStream ... для согласованности, хотя вы должны использовать тот же тип поток для чтения и записи). Я не могу проверить этот код в данный момент, но вы можете попробовать что-то вроде этого:

QList<QLineEdit*> example;
while(!stream.atEnd())
{
   QString str;
   stream >> str;
   if( stream.isNull() )
     break;
   QLineEdit* le = new QLineEdit();
   le->setText(str);
   example.append(le);
}
1 голос
/ 17 ноября 2009

Строковый объект не выделяется потоком. Используйте объект QString вместо указателя.

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

Или вы можете написать свои собственные функции потоковой передачи QLineEdit

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;
  }
}
...