码迷,mamicode.com
首页 > 其他好文 > 详细

XML编辑工具

时间:2015-03-08 18:44:21      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

【标题】XML编辑工具

【开发环境】Qt 5.2.0,  C++

【概要设计】使用QT的视图/模型结构、treeview控件以树形结构显示所要操作的XML文件,并实现修改和保存功能

【详细设计】

主要包含 node.h(节点类)、model.h(模型类)、xml.h(xml操作类)

技术分享

node.h文件

使用两个Qstring字符串变量作为类成员,分别用于表示XML文件的节点名和节点值,一个Node节点表示父节点和一个Qlist列表用于存储孩子节点

#ifndef NODE_H
#define NODE_H

#include <QList>
#include <QString>

class Node
{
public:
    Node(QString Nodename,  QString Nodetext);
    Node();
    ~Node();
    QString Nodename;
    QString Nodetext;
    Node *parent;
    QList<Node *> children;

};
#endif // NODE_H

构造函数:

 8 Node::Node()
 9 {
10     this->Nodename = "";
11     this->Nodetext = "";
12     parent = 0;
13 }

model.h文件

继承自QAbstractItemModel类,按照Qt模型的要求实现相应的函数

#ifndef MODEL_H
#define MODEL_H

#include <QAbstractItemModel>
#include "node.h"

class Model : public QAbstractItemModel
{
public:
    Model(QObject *parent = 0);
    ~Model();
    void setRootNode(Node *node);
    QModelIndex index(int row, int column,
                      const QModelIndex &parent) const;
    QModelIndex parent(const QModelIndex &child) const;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role) const;

private:
    Node *nodeFromIndex(const QModelIndex &index) const;
    Node *rootNode;
};

data函数,如果是第一列则显示节点名,如果是第二列,则显示节点的值

 1 QVariant Model::data(const QModelIndex &index, int role) const
 2 {
 3     if (role != Qt::DisplayRole)
 4         return QVariant();
 6     Node *node = nodeFromIndex(index);
 8     if (index.column() == 0)
 9         return node->Nodename;
10     else if (index.column() == 1)
11         return node->Nodetext;
12 }
13 

将XML加载到内存中

    QFile file("F:/538.xml");
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(this, tr("error!"), "open file faild!");
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        QMessageBox::information(this, tr("error!"), "add xml faild!");
    }
    file.close();

  

将XML读取到模型中

将读取到的XML元素名和元素值依次赋值给node节点的nodename和nodetext

  QDomNode n = doc.documentElement().firstChild();
    while(!n.isNull())
    {
        QDomElement e = n.toElement();
        Node *node = new Node();
        node->Nodename = n.toElement().tagName();
        node->Nodetext = n.toElement().text();
        RootNode->children += node;
        if(n.hasChildNodes())
        {
          treal(n, node);
        }
        n = n.nextSibling();
    }

修改XML

将点击treeview视图时产生的索引转换成节点,用一个label控件和一个lineEdit控件分别显示节点名和节点值

当用户将lineEidt中内容编辑完成时点击Update按钮,将lineEdit的文本信息赋值给模型中所要编辑节点的nodetext;

 1 void MainWindow::on_treeView_clicked(const QModelIndex &index)
 2 {
 3     Node *node = new Node();
 4     node = static_cast<Node *>(index.internalPointer());
 5     ui->label->setText(node->Nodename + ":");
 6     ui->lineEdit->setText(node->Nodetext);
 7     totalindex = index;
 8 }
 9 
10 void MainWindow::on_Update_clicked()
11 {
12     Node *node = new Node();
13     node = static_cast<Node *>(totalindex.internalPointer());
14     node->Nodetext = ui->lineEdit->text();
15     QDomNodeList list = doc.elementsByTagName(node->Nodename);
16     list.at(0).setNodeValue(ui->lineEdit->text());
17 
18 }

 

XML编辑工具

标签:

原文地址:http://www.cnblogs.com/forerve/p/4321947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!