使用 Qt 在文件中保存和加载数据的最简单方法是什么?
您能否提供一个示例如何执行此操作?
您可以创建一个公共slot
用于写入,它将在您的 QML 信号处理程序中调用。
然后,您可以创建一个Q_INVOKABLE
用于读取返回数据的方法或一个用于读取 void 返回值的槽。在后一种情况下,如果是用例,您可以拥有一个映射到所需属性的数据属性。
总体而言,正确的解决方案取决于尚未提供的更多上下文。
不幸的是,由于信号槽机制以及 QML 引擎此时围绕 s 构建的事实,该类需要包含Q_OBJECT
宏并且它需要继承该类。未来可能会改变,希望如此。QObject
QObject
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;
};
/*
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:
...
MyClass *myClass = new MyClass();
viewContext->setContextProperty("MyClass", myClass);
...
然后你可以从 QML 调用这些函数,如下所示:
...
Page {
Button {
text: "Read"
onClicked: readLabel.text = myClass.read()
}
Label {
id: readLabel
}
Button {
text: "Write"
onClicked: myClass.write()
}
}
...
免责声明:我像原始文本一样编写此代码,因此它可能无法编译,可能会吃掉婴儿等,但它应该展示背后的想法。最后,您将拥有两个用于读取和写入操作的按钮,以及一个显示读取的文件内容的标签。