【转载】QTreeView显示xml数据

http://www.qtcentre.org/threads/44877-Convert-XML-to-QTreeView

xml文件中数据如下:

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <data>
  3. <feature>
  4. <name>Sex</name>
  5. <value>Male</value>
  6. <value>Female</value>
  7. <value>Unknown</value>
  8. </feature>
  9. <feature>
  10. <name>Color</name>
  11. <value>Red</value>
  12. <value>Green</value>
  13. <value>Blue</value>
  14. <value>White</value>
  15. <value>Black</value>
  16. <value>Unknown</value>
  17. </feature>
  18. <feature>
  19. <name>Size</name>
  20. <value>Small</value>
  21. <value>Medium</value>
  22. <value>Large</value>
  23. <value>Unknown</value>
  24. </feature>
  25.  
  26. </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);
    }
  }
}

结果如下:

posted @ 2013-10-28 21:39  大山爸  阅读(1897)  评论(0编辑  收藏  举报