Как читать и писать классы коллекции Qt - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь реализовать функции для записи и чтения QLinkedList<DataClass> в файл, используя QDataStream.Документация Qt ( Чтение и запись классов коллекции Qt ) на данный момент немного экономна.

Моя функция записи выглядит следующим образом:

void
MainWindow::handle_btn_save_clicked()
{
    auto fileName = QFileDialog::getSaveFileName(
             this,
             tr("Save Data"),
             ".",
             tr("Files (*)") );

    QFile file(fileName);
    file.open(QIODevice::WriteOnly);
    QDataStream dstream(&file);

    // write table data to file
    dstream << dataList; // QLinkedList<DataClass> *dataList;

    file.close();
}

и чтениефункция должна выглядеть следующим образом:

void
MainWindow::handle_btn_load_clicked()
{
    auto fileName = QFileDialog::getOpenFileName(
             this,
             tr("Load Data"),
             ".",
             tr("Files (*)") );

    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    QDataStream dstream(&file);

    QLinkedList<DataClass> *dl;
    dstream >> dl;

    file.close();
}

компилятор выдает это

/opt/Qt/5.10.1/gcc_64/include/QtCore/qdatastream.h:263: error: no match for ‘operator>>’ (operand types are ‘QDataStream’ and ‘QLinkedList<MainWindow::DataClass>::value_type {aka MainWindow::DataClass}’)
         s >> t;
         ~~^~~~

Как это сделать правильно?


Определяется следующим образом:

class DataClass
{
public:
    int val0;
    int val1;
    int val2;
};

1 Ответ

0 голосов
/ 25 мая 2018

QDataStream знает, как сериализовать QLinkedList, но не знает, как сериализовать DataClass, поэтому вы должны реализовать его:

class DataClass
{
public:
    int val0;
    int val1;
    int val2;

    friend QDataStream & operator<< (QDataStream& stream, const DataClass& s){
        stream << s.val0 << s.val1 << s.val2;
        return stream;
    }
    friend QDataStream & operator>> (QDataStream& stream, DataClass& s){
        stream >> s.val0 >> s.val1 >> s.val2;
        return stream;
    }
};

Пример:

#include <QCoreApplication>
#include <QDataStream>
#include <QFile>
#include <QLinkedList>

class DataClass
{
public:
    int val0;
    int val1;
    int val2;

    friend QDataStream & operator<< (QDataStream& stream, const DataClass& s){
        stream << s.val0 << s.val1 << s.val2;
        return stream;
    }
    friend QDataStream & operator>> (QDataStream& stream, DataClass& s){
        stream >> s.val0 >> s.val1 >> s.val2;
        return stream;
    }
};

static void save(QLinkedList<DataClass> l, const QString & fileName){
    QFile file(fileName);
    if(!file.open(QFile::WriteOnly))
        return;
    QDataStream dstream(&file);
    dstream << l;
}

static QLinkedList<DataClass> read(const QString & fileName){
    QLinkedList<DataClass> l;
    QFile file(fileName);
    if(file.open(QFile::ReadOnly)){
        QDataStream dstream(&file);
        dstream >> l;
    }
    return l;

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const QString fileName = "test.txt";

    QLinkedList<DataClass> in;
    DataClass din;
    din.val0 = 1;
    din.val0 = 2;
    din.val0 = 3;

    in << din;
    save(in, fileName);
    QLinkedList<DataClass > out;

    out = read(fileName);
    DataClass dout = out.first();

    Q_ASSERT(dout.val0 == din.val0);
    Q_ASSERT(dout.val1 == din.val1);
    Q_ASSERT(dout.val2 == din.val2);

    return 0;
}
...