如何编写QVector文件

时间:2014-09-06 09:19:28

标签: c++ qt

我正在尝试编写由我的类的对象组成的QVector文件并且遇到一些问题。我需要将一些对象保存到.txt文件,然后将它们读出来。但是储蓄不能正常运作。我可以释放它的方式是什么?

Film.h

class Film
{
public:
    QString title;
    int year;
    friend QDataStream &operator<< (QDataStream &stream, const Film obj)
    {
        stream << obj.title; //title only while i'm testing my program
        return stream;
    }
    friend QDataStream &operator>> (QDataStream &stream, Film &obj)
    {
        stream >> obj.title;
        return stream;
    }
};

AddFilm.cpp

void AddFilm::slotOkButtonClicked()
{
    QVector<Film> database;
    Film film;
    film.title = titleLine->text(); // QLineEdit where i input data
    film.year = yearLine->text().toInt(); // QLineEdit where i input data
    database.push_back(film);
    QFile file("database.fdtb");
    if(file.open(QIODevice::WriteOnly))
    {
        QDataStream out(&file);
        out << film;
        file.close();
    }

1 个答案:

答案 0 :(得分:2)

在流式传输类之前,您应该在启动应用程序时在代码中的某个位置注册类的流操作符。这可以在主窗口的构造函数中完成:

qRegisterMetaTypeStreamOperators<Film>("Film");

现在,您可以在文件中保存或加载类的对象。

将自定义类的某些对象保存到文件中:

QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
         QMessageBox::information(this, tr("Unable to open file"),
             file.errorString());
         return;
 }


 QDataStream out(&file);
 out.setVersion(QDataStream::Qt_4_8);
 out << object1;

从文件中加载自定义类的对象:

QFile file(fileName);
 if (!file.open(QIODevice::ReadOnly)) {
         QMessageBox::information(this, tr("Unable to open file"),
             file.errorString());
         return;
 }


  QDataStream in(&file);
  in.setVersion(QDataStream::Qt_4_8);
  in >> object1;

您还可以使用QSettings在应用程序中保存对象:

QSettings settings("organizationName","applicationName");
settings.setValue("settings/ّFilm",QVariant(film));

或阅读它们:

Film film = settings.value(QString("settings/film")).value<Film>();

Film应该从QObject继承,并且应该具有公共默认和复制构造函数以及公共析构函数。您还应该拥有宏Q_DECLARE_METATYPE(Film)

如果需要使用文件,您可以为QSettings定义文件名:

settings=new QSettings("Mysettings/film.ini", QSettings::IniFormat,this);