2014-09-06 89 views
2

我想写QVector包含我的类的文件对象,并有一些问题。我需要将一些对象保存为.txt文件,然后将其读出。但保存不能正常工作。我可以释放它的方式是什么?如何写QVector文本文件

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

回答

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); 
+0

非常感谢您的帮助,但我仍然有一个小问题。我想写一个qvector文件,而不是一个对象。我的程序向我展示了向量中的元素0,但是当我想要看下一个元素时,我遇到了“索引超出范围”的错误。我试图用qvector代码: QVector base; ... base.push_back(film); ... out << base; – 2014-09-06 12:06:40

+0

请帮助我,我没有任何想法如何解决这个问题.. – 2014-09-06 13:05:32

+0

如果你只推动向量中的一个项目,他们如何访问下一个项目? – Nejat 2014-09-07 06:21:12