[英]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.