【转载】QTreeView显示xml数据
http://www.qtcentre.org/threads/44877-Convert-XML-to-QTreeView
xml文件中数据如下:
-
<?xml version='1.0' encoding='utf-8'?>
-
<data>
-
<feature>
-
<name>Sex</name>
-
<value>Male</value>
-
<value>Female</value>
-
<value>Unknown</value>
-
</feature>
-
<feature>
-
<name>Color</name>
-
<value>Red</value>
-
<value>Green</value>
-
<value>Blue</value>
-
<value>White</value>
-
<value>Black</value>
-
<value>Unknown</value>
-
</feature>
-
<feature>
-
<name>Size</name>
-
<value>Small</value>
-
<value>Medium</value>
-
<value>Large</value>
-
<value>Unknown</value>
-
</feature>
-
-
</data>
Qt代码如下:
1:xmltreetest.h
#ifndef XMLTREETEST_H
#define XMLTREETEST_H
#include <QtWidgets/QMainWindow>
#include <qstandarditemmodel.h>
#include <qdom.h>
#include <qfile.h>
#include <qtreeview.h>
#include <iostream>
#include "ui_xmltreetest.h"
using namespace std;
class XMLTreeTest : public QMainWindow
{
Q_OBJECT
public:
XMLTreeTest(QWidget *parent = 0);
~XMLTreeTest();
void startTree();
void insertFather(QString name);
void insertChildren(QString name);
void setItem(QStandardItemModel *model);
void preOrder(QDomNode dom, QStandardItemModel *model);
QTreeView *view;
QStandardItem *item;
int nRow;
};
#endif // XMLTREETEST_H
2: xmltreetest.cpp
#include "xmltreetest.h"
XMLTreeTest::XMLTreeTest(QWidget *parent)
: QMainWindow(parent)
{
nRow = 0;
startTree();
}
XMLTreeTest::~XMLTreeTest()
{
}
void XMLTreeTest::startTree(){
QDomDocument doc("mydocument");
QFile file("metadata.xml");
if (!file.open(QIODevice::ReadOnly)){
cout<< "ERROR"<< endl;
return;
}
if (!doc.setContent(&file)) {
cout << "ERROR" << endl;
file.close();
return;
}
file.close();
QStandardItemModel *model = new QStandardItemModel();
preOrder(doc.firstChild(), model);
view = new QTreeView(this->centralWidget());
view->setModel(model);
view->show();
}
void XMLTreeTest::insertFather(QString name){
item = new QStandardItem(name);
item->setEditable(false);
}
void XMLTreeTest::insertChildren(QString name){
QStandardItem *subItem = new QStandardItem( name );
subItem->setCheckable(true);
subItem->setEditable(false);
item->appendRow(subItem);
}
void XMLTreeTest::setItem(QStandardItemModel *model){
model->setItem(nRow, item);
nRow++;
}
void XMLTreeTest::preOrder(QDomNode dom, QStandardItemModel *model){
if(!dom.isNull()){
string aux = dom.nodeName().toStdString();
string name = "name";
string value = "value";
if(dom.isText()){
aux = dom.parentNode().nodeName().toStdString();
if(strcmp(aux.c_str(),name.c_str())==0){
cout << dom.nodeValue().toStdString() << endl;
insertFather(dom.nodeValue());
setItem(model);
}
if(strcmp(aux.c_str(),value.c_str())==0){
cout << "\t" << dom.nodeValue().toStdString() << endl;
insertChildren(dom.nodeValue());
}
}else{
preOrder(dom.firstChild(), model);
preOrder(dom.nextSibling(), model);
}
}
}
结果如下: