【问题标题】:How to write QVector fo txt file如何编写 QVector fo txt 文件
【发布时间】:2014-09-06 09:19:27
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的帮助,但我仍然有一个小问题。我想将一个 qvector 写入文件,而不是一个对象。我的程序显示向量中的元素 0,但是当我想查看下一个时,出现“索引超出范围”错误。我尝试将您的代码与 qvector 一起使用: QVector base; ... base.push_back(电影); ... out
    • 如果你只在向量中推送一个项目,你想如何访问下一个项目?
    • 我在向量中推送了一些对象。我正在启动我的程序,转到添加电影并调用插槽 okButtonClicked(将对象推送到矢量并将矢量保存到文件)大约 5 次。所以我认为向量中应该有 5 个对象,不是吗?
    • 尝试在调试模式下查看vector的count(),检查它是否真的有5个元素。
    • 非常感谢您的帮助,我真的很感激。我想我已经解决了我的问题,我稍后会尝试解决它。​​
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多