[英]How do you serialize a QMap?
我正在尝试使用以下代码学习如何在窗口化应用程序中序列化QMap对象:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QString>
#include <QDataStream>
#include <QMap>
#include <QDebug>
void write ()
{
QString filename = "Z:/snippets.txt";
QFile myFile (filename);
if (!myFile.open(QIODevice::WriteOnly))
{
qDebug() << "Could not write " << filename;
return;
}
QMap<QString,QString> map;
map.insert("one","this is 1");
map.insert("two","this is 2");
map.insert("three","this is 3");
QDataStream out (&myFile);
out.setVersion(QDataStream::Qt_5_3);
out<<map;
myFile.flush();
myFile.close();
}
QMap<QString,QString> read ()
{
QString filename = "Z:/snippets.txt";
QFile myFile (filename);
QMap<QString,QString> map;
QDataStream in (&myFile);
in.setVersion(QDataStream::Qt_5_3);
if (!myFile.open(QIODevice::WriteOnly))
{
qDebug() << "Could not read " << filename;
return (map);
}
in >> map;
myFile.close();
return(map);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnSave_clicked()
{
write();
}
void MainWindow::on_btnLoad_clicked()
{
QMap<QString,QString> map;
map = read();
QMapIterator<QString,QString> i(map);
//do other stuff
}
btnSave调用的write()
函数确实保存了QMap。 我可以在snippets.txt中看到数据。 我可以在调试器中看到, read()
函数并未将任何内容分配给map
变量。 我错过了什么?
正确的QMap
序列化和反序列化代码如下:
#include <QString>
#include <QFile>
#include <QMap>
#include <QDataStream>
#include <QDebug>
void write()
{
QString filename = "snippets.txt";
QFile myFile(filename);
if (!myFile.open(QIODevice::WriteOnly))
{
qDebug() << "Could not write to file:" << filename << "Error string:" << myFile.errorString();
return;
}
QMap<QString, QString> map;
map.insert("one", "this is 1");
map.insert("two", "this is 2");
map.insert("three", "this is 3");
QDataStream out(&myFile);
out.setVersion(QDataStream::Qt_5_3);
out << map;
}
QMap<QString,QString> read()
{
QString filename = "snippets.txt";
QFile myFile(filename);
QMap<QString, QString> map;
QDataStream in(&myFile);
in.setVersion(QDataStream::Qt_5_3);
if (!myFile.open(QIODevice::ReadOnly))
{
qDebug() << "Could not read the file:" << filename << "Error string:" << myFile.errorString();
return map;
}
in >> map;
return map;
}
int main()
{
write();
qDebug() << read();
return 0;
}
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
qmake && make && ./main
QMap(("one", "this is 1")("three", "this is 3")("two", "this is 2"))
您遇到了几个问题:
这使您很难揭示真正的问题。
没有适当的错误报告,这就是隐藏的问题。 这里的问题是,当您打开文件以仅进行写入时,任何后续读取操作自然会产生空结果。 通过QDataStream
进行QDataStream
,它有点隐蔽,但是如果直接通过QFile实例阅读时快速浏览QIODevice文档 ,则会更加清楚错误打开模式的底层内容 :
从设备读取最多maxSize字节为数据,并返回读取的字节数。 如果发生错误(例如,当尝试从以WriteOnly模式打开的设备中读取数据时),此函数将返回-1。
如果检查了错误,这将变得更加清楚。 公平地说,在你的情况下共享文件而不关闭它,然后在这个简单的代码片段中可以接受操作。 在这种情况下,您应该使用类似重新搜索开头和QIODevice :: ReadWrite的方法。 话虽如此,这只是另一种方式。
这只是一个附注,但你明确地添加了空格,而qDebug()已经为你做了。
这是多余的,因为通过类析构函数关闭文件描述符时,它是自动完成的。
这是由适当的RAII自动完成的。 如果文件仍处于打开状态,析构函数将为您关闭它。 由于您保留了函数的作用域,因此在堆栈上构造析构函数时,将自动为文件对象调用析构函数。
可能是因为您在读取功能中以WriteOnly
打开文件。 正确的形式是:
if (!myFile.open(QIODevice::ReadOnly))
{
qDebug() << "Could not read " << filename;
return (map);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.