我们上一节讲完了读出Nodes和其他属性信息的程序,接下来我们把两个Item读到group里面。
#pragma once
#include <QObject>
#include "tsfunitem.hpp"
class TsfunGroup : public QObject {
Q_OBJECT
public:
TsfunGroup(QObject * parent = Q_NULLPTR);
~TsfunGroup();
TsfunItemList tsfitmlist;
QDomDocument xmlFile;
void readXML(const QString& filename);
private:
QString filename;
};
注意 TsfunItemList 是前文定义的存放 TsfunItem 的列表。关键就是readMXL文件了:
#include "tsfungroup.hpp"
#include "debugwidget.hpp"
TsfunGroup::TsfunGroup(QObject * parent) : QObject(parent) {
}
TsfunGroup::~TsfunGroup() {
}
先把无关紧要的两个函数放进去,接下来是函数:
void TsfunGroup::readXML(const QString& filename)
{
}
为了看着更简洁,我们一段一段的解释程序:
DebugWidget *dw = new DebugWidget;
QFile file("C:\\Developer\\Rendering\\Rendering\\XML\\transferfunction.xml");
if (!file.open(QIODevice::ReadOnly))
dw->addContents("error 1");
if (!xmlFile.setContent(&file))
{
file.close();
dw->addContents("error 2");
}
file.close();
//这里有类似于version这样的第一个子节点信息。
QDomNode firstChild = xmlFile.firstChild();
if (firstChild.nodeName() == "xml") {
dw->addContents(firstChild.nodeName());
dw->addContents(firstChild.nodeValue());
}
else {
dw->addContents("No version , No Format");
}dw->addContents("");
这一段其实也没有什么特别的,之前都讲过很多遍了。打印出来的效果如下:
xml
version='1.0' encoding='UTF-8'
之后我们读取根元素并打印:
//读取根元素<TsfunGroup>
QDomElement root = xmlFile.documentElement();
dw->addContents("[" + root.tagName() + "]");
dw->addContents("");
这个之前也讲了很多遍了,综合打印效果如下:
xml
version='1.0' encoding='UTF-8'
[TsfunGroup]
QDomNode TsfunItem1 = root.firstChild();
//dw->addContents(TsfunItem1.toElement().tagName());
while (!TsfunItem1.isNull())
{
dw->addContents(TsfunItem1.toElement().tagName()+" "+ TsfunItem1.toElement().attribute("Name"));
TsfunItem tsfunitemdata;
tsfunitemdata.readTsfunItem(TsfunItem1.childNodes());
tsfitmlist.append(tsfunitemdata);
dw->addContents(QString::number(tsfunitemdata.returnNumOfNodes()));
TsfunItem1 = TsfunItem1.nextSiblingElement();
}
循环和以前套路差不多,区别就是直接在里面使用了readTsfunItem(TsfunItem1.childNodes()); ,它读取了TsfunItem1里面的数据,然后TsfunItem1迭代到下一个TsfunItem,之后再读出来。打印效果如下:
xml
version='1.0' encoding='UTF-8'
[TsfunGroup]
TsfunItem normalMode
6
TsfunItem maxMode
6
说明确实读出来了里面的6个元素,但是这6个元素到底对不对,我们还得想办法在输出中测验测验,鉴于这些变量都是私有的,我们要再添加一些接口,作为留给下一节的任务。