QT Tree存储 XML的数据

来源:互联网 发布:软件杂志高岚 编辑:程序博客网 时间:2024/05/20 11:49


使用treeview的时候有时会在节点中存储一些数据,以供点击的时候根据存储的数据响应相应的时间。

一下做一次简要的概括:

从XML中读取数据并存入Tree的data中

XML文件为:

<?xml version ="1.0"?><LIST><DEVICE ID="0" NAME="ipc1" IP="192.168.1.100" PORT="554" /><DEVICE ID="1" NAME="ipc2" IP="192.168.1.155" PORT="554" /><DEVICE ID="2" NAME="ipc3" IP="192.168.1.198" PORT="554" /></LIST>


主程序

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}



窗口程序代码头文件

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QtCore>#include <QtXml>#include <QTreeWidget>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    struct DeviceInfo    {        QString id;        QString name;        QString ip;        QString port;    };private slots:    void on_actionOpen_triggered();    void TreeViewDoubleClick(const QModelIndex inIndex);private:    Ui::MainWindow  *ui;    QTreeWidget     *fTree;private:    int     ReadXML();    void    PraseXMLToTree(QDomDocument inDoc, QTreeWidget *inTree);    QDomDocument    fDoc;    QString         fFileName;    DeviceInfo      **fDeviceInfoArray;    int             fXMLCount;    static  int     sDataColumn;    static  int     sDataRole;};#endif // MAINWINDOW_H


主程序cpp


</pre><pre name="code" class="cpp">#include "mainwindow.h"#include "ui_mainwindow.h"static QString XMLFILENAME = "D:/Device.xml";int    MainWindow::sDataColumn  = 1;    //can't set 0int    MainWindow::sDataRole    = 0;MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow),    fFileName(XMLFILENAME){    ui->setupUi(this);    fTree = new QTreeWidget();    fTree->setColumnCount(1);    fTree->setHeaderLabel("Devices");    fTree->setParent(ui->centralWidget);    fTree->move(0,0);    fTree->resize(100,500);    fTree->show();    connect(fTree,SIGNAL(doubleClicked(const QModelIndex)),this,SLOT(TreeViewDoubleClick(const QModelIndex)));    ReadXML();}MainWindow::~MainWindow(){    if(fDeviceInfoArray != NULL)    {        for(int i=0; i< fXMLCount;i++)        {            delete fDeviceInfoArray[i];            fDeviceInfoArray[i] = NULL;        }    }    delete []fDeviceInfoArray;    delete ui;}int MainWindow::ReadXML(){    QFile   file(fFileName);    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))    {        qDebug()<<"failed to open file !";        return -1;    }    else    {        if(!fDoc.setContent(&file))        {            qDebug()<<"failed to load document !";            return -1;        }        file.close();    }    PraseXMLToTree(fDoc,fTree);    return 0;}void MainWindow::PraseXMLToTree(QDomDocument inDoc, QTreeWidget *inTree){    QDomElement root = inDoc.firstChildElement();    //get the root    QString rootName = root.tagName();    QTreeWidgetItem *rootNode = new QTreeWidgetItem(QStringList(rootName));    inTree->addTopLevelItem(rootNode);    QDomNodeList items = root.childNodes();    fXMLCount    = items.count();    fDeviceInfoArray  = new DeviceInfo*[fXMLCount];    qDebug()<< "total items = " << items.count();    for(int i = 0; i< items.count();i++)    {        QDomNode    itemnode = items.at(i);        if(itemnode.isElement())        {            fDeviceInfoArray[i] = new DeviceInfo();            QDomElement itemElem = itemnode.toElement();            fDeviceInfoArray[i]->id       = itemElem.attribute("ID");            fDeviceInfoArray[i]->name     = itemElem.attribute("NAME");            fDeviceInfoArray[i]->ip       = itemElem.attribute("IP");            fDeviceInfoArray[i]->port     = itemElem.attribute("PORT");                       QTreeWidgetItem *treeNode = new QTreeWidgetItem(QStringList(fDeviceInfoArray[i]->name));            treeNode->setData(sDataColumn,sDataRole,QVariant::fromValue((void *) fDeviceInfoArray[i]));            rootNode->addChild(treeNode);        }    }}void MainWindow::TreeViewDoubleClick(const QModelIndex inIndex){    DeviceInfo *currDevice = (DeviceInfo *)fTree->currentItem()->data(sDataColumn,sDataRole).value<void *>();      ui->label->setText( currDevice->id + "\n" + currDevice->name + "\n" + currDevice->ip + "\n" + currDevice->port);}

0 0
原创粉丝点击