我是Qt和QML的新手。话虽如此,我正在QML中创建一个可编辑列表,我想将其导入和导出为XML文件。现在,我一直坚持从XML文件导入它,并ListView
从C ++方面将其设置为我的模型。
我希望我可以将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的ListViewListModel
或任何支持从QML一侧进行编辑的模型?
--UPDATE-- XML文件的解析将是一次性过程,在解析之后,我打算使用javascript中的数据,因此如果可以用JSON对象结构解析数据,那将很酷。
最后,我使用QDomDocument
类读取XML文件,遍历所有节点,并将想要的值写入JSON对象,如下所示:
QDomElement root = doc.firstChildElement();
QDomNodeList programme = root.elementsByTagName("node");
nodeCollection.push_back(ListElements(program, "title", "lang"));
...
QJsonObject ListElements (QDomElement root, QString tagname, QString attribute)
{
QDomNodeList items = root.elementsByTagName(tagname);
for(int i = 0; i < items.count(); i++)
{
QDomNode itemnode = items.at(i);
if (itemnode.isElement())
{
QDomElement itemElement = itemnode.toElement();
qInfo() << itemElement.tagName(); // <-element name
qInfo() << itemElement.attribute("lang"); // <-element attribute
qInfo() << itemElement.text(); // <-element text
// putting the values above inside JSOn object:
auto nodeData = QJsonObject(
{
qMakePair(QString(itemElement.tagName()), QJsonValue(itemElement.text())),
qMakePair(QString("lang"), QJsonValue(itemElement.attribute("lang"))),
});
return nodeData;
}
}
}
所以这:
<node>
<title lang="en">Title1</title>
<category lang="en">Category1</category>
<desc lang="en">Description1</desc>
</node>
变为(ListElements
返回的内容):
QJsonObject({"title":"Title1","lang":"en"})
QJsonObject({"category":"Category1","lang":"en"})
QJsonObject({"desc":"Description1","lang":"en"})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句