将数据保存到Qt中的文件

时间:2013-12-31 16:58:19

标签: c++ qt qml qtcore qfile

使用Qt在文件中保存和加载数据的最简单方法是什么?

请举例说明如何做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以创建一个公共slot进行写作,这将在您的QML信号处理程序中调用。

然后,您可以使用返回的数据创建用于读取的Q_INVOKABLE方法,或者使用void返回值创建用于读取的插槽。在后一种情况下,如果是用例,则可以使用映射到所需属性的data属性。

总的来说,正确的解决方案取决于尚未提供的更多背景信息。

该类需要包含Q_OBJECT宏,并且由于信号槽机制以及QML引擎围绕QObject构建的事实,它需要继承QObject类。不幸的是,在这个时间点。希望未来可能会改变。

myclass.h

class MyClass : public QObject
{
    Q_OBJECT
    // Leaving this behind comment since I would not start off with this.
    // Still, it might be interesting for your use case.
    // Q_PROPERTY(QByteArray data READ data WRITE setData NOTIFY dataChanged)
    public:
        MyClass() {} // Dummy for now because it is not the point
        ~MyClass() {} // Dummy for now because it is not the point

   Q_INVOKABLE QByteArray read();
   QByteArray data() const ;

   public slots:
       // void read(); // This would read into the internal variable  for instance
       void write(QByteArray data) const;

   // private:
       // QByteArray m_data;
};

myclass.cpp

/* 
void MyClass::read()
{
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QTextStream in(&file);
    // You could also use the readAll() method in here.
    // Although be careful for huge files due to memory constraints
    while (!in.atEnd()) {
        QString line = in.readLine();
        m_data.append(line);
    }
}
*/

QByteArray MyClass::read()
{
    QByteArray data;
    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QTextStream in(&file);
    // You could use readAll() here, too.
    while (!in.atEnd()) {
        QString line = in.readLine();
        data.append(line);
    }

    file.close();
    return data;
}

void MyClass::write(QByteArray data)
{
    QFile file("out.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;

    QTextStream out(&file);
    out.write(data);
    file.close();
}

完成后,您可以通过以下方式将此功能公开给QML:

的main.cpp

...
MyClass *myClass = new MyClass();
viewContext->setContextProperty("MyClass", myClass);
...

然后你可以按如下方式从QML中调用这些函数:

main.qml

...
Page {
    Button {
        text: "Read"
        onClicked: readLabel.text = myClass.read()
    }

    Label {
        id: readLabel
    }

    Button {
        text: "Write"
        onClicked: myClass.write()
    }
}
...

免责声明:我写这段代码就像原始文本一样,所以它可能无法编译,它可能会吃掉婴儿等等,但它应该证明背后的想法。最后,您将有两个用于读取和写入操作的按钮,以及一个显示读取的文件内容的标签。