【发布时间】:2017-11-01 21:52:16
【问题描述】:
我是 Qt 和 QML 的新手。话虽如此,我正在 QML 中制作一个可编辑的列表,我想将其导入和导出为 XML 文件。现在我坚持从 XML 文件中导入它并从 C++ 端将其设置为我的ListView 模型。
我希望我可以将 XML 转换为表单
我希望能够从 QML 端添加、删除和编辑我的 ListView 中的行,因此使用 XmlListModel 看起来是个坏主意,即它不提供这些功能。
我在其中选择文件位置的 main.qml:
FileDialog {
id: exportDialog
title: "Please choose an XML TV file"
nameFilters: [("*.xml")]
onAccepted: {
fileio.parse(importDialog.fileUrl)
}
onRejected: {
console.log("Canceled")
}
}
我希望在其中进行转换的 C++ 头文件:
#ifndef FILEIO_H
#define FILEIO_H
#include <QObject>
#include <QFile>
#include <QTextStream>
#include <QXmlStreamReader>
#include <QDebug>
class FileIO : public QObject
{
Q_OBJECT
public slots:
bool parse(const QString& source)
{
if (source.isEmpty())
return false;
QFile file(source);
if (!file.open(QFile::WriteOnly | QFile::Truncate))
return false;
QFile* mjau = new QFile(source);
if (!mjau->open(QIODevice::ReadOnly | QIODevice::Text)) {
printf("Load XML File Problem");
return false;
}
QXmlStreamReader reader(mjau);
while(!reader.atEnd() && !reader.hasError()) {
if(reader.readNext() == QXmlStreamReader::StartElement && reader.name() == "parent") {
qDebug() << reader.readElementText();
//printf(reader.readElementText())
}
}
}
public:
FileIO() {}
};
#endif // FILEIO_H
我要解析的 xml 文件示例,大量条目:
<notes>
<note>
<heading>Help</heading>
<body>I want to make this work!</body>
</note>
<note>
<heading>Because</heading>
<body>I love QML <3</body>
</note>
...
</notes>
这样的:
ListModel {
id: notes
ListElement {
heading: "Help"
body: "I want to make this work!"
}
ListElement {
heading: "Because"
body: "I love QML <3"
}
}
现在,当我选择 XML 文件时,什么也没有发生,但是同一个文件被“清除”,变成了一个空白的 .xml 文件。
如何正确解析它,然后将解析后的数据转换为 QML 的 ListView ListModel 或任何可以支持 QML 侧编辑的模型?
--更新-- XML文件的解析将是一个一次性的过程,在解析之后我打算在javascript中处理数据,所以如果数据可以在JSON对象结构中解析会很酷。
【问题讨论】: