c++ - 如何读写 Qt 集合类

标签 c++ qt qt5

我尝试实现函数来写入和读取 QLinkedList<DataClass>使用 QDataStream 到文件. Qt 文档 ( Reading and Writing Qt Collection Classes ) 在这一点上有点保守。

我的写函数是这样的:

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

最佳答案

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

关于c++ - 如何读写 Qt 集合类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50519324/

相关文章:

c++ - 无形式或非形式单元的函数返回值

c++ - 在纯 C++ 中实现 Linux 内核的 __is_constexpr (ICE_P) 宏

c++ - 将 C++ 数组传递给 Fortran 子例程导致 nan 值出现在结果中

c++ - 设置 QtCreator 在 Ubuntu 14.04 上为 arm7 设备开发应用程序

c++ - Qt中连接不同类的信号槽

c++ - 导入机器人机械臂(6 轴)的连接部件并通过用户输入(C++ 代码)使每个关节旋转

c++ - 将字符打包成 5 位并将结果写入文件 (C++)

qt - 在 QT 中动态创建与工具按钮关联的上下文菜单

android - 如何使用 QML 在 iOS 和 Android 上 [以正确的方式] 显示网页内容

c++ - 使用 QEventLoop 调用函数