gpt4 book ai didi

c++ - QML Qt- 解析 XML 并将其转换为 LisView 的 ListModel

转载 作者:行者123 更新时间:2023-11-30 03:27:47 26 4
gpt4 key购买 nike

我是 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 对象结构,那就太酷了。

最佳答案

您不应将其转换为 ListModel。而是实现您自己的具有所需功能的 QAbstractListModel 的后代。

然而,Qt 确实以只读方式提供 XmlListModel 可能是有原因的。 You can't just insert into a file. (AFAIK)因此,如果添加或删除了一个条目,并且该更改不在文件的最后,则需要复制整个内容。当数据发生变化时,就需要这样做。不利于性能。

如果您考虑做类似的事情,请不要永久回信。想一想什么时候回写的好时机。一个明显的点是模型何时被销毁。但由于可能存在一些问题,因此无法正确销毁该对象,您可能需要不时保存。

您可以使用计时器来保存,例如更改后 10 秒(预计,如果发生一次更改,很快就会发生许多更改)

您还可以为 XML 使用更复杂的格式,您实际上只是附加基本上记录更改。有时您会清理重写文件,这样历史记录就会丢失,但更改确实会应用到您的 xml 结构。

关于c++ - QML Qt- 解析 XML 并将其转换为 LisView 的 ListModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47064287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com