最近也不知道出于什么样的想法,想自己做一个XML生成器,顾名思义,就是给一些输入,然后输出XML文件。断断续续捣鼓了数天,算是差不多了。
基本思路是先获取用户输入生成一棵树,然后根据生成的数形成XML格式的文件。关于树控件编辑器,参考了Qt自带“编辑树窗口部件”,如下图展示。
关于写XML文件,本设计采用DOM的方式,DOM 一次性读入整个 XML 文档,在内存中构造为一棵树(被称为 DOM 树)。我们能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件。在 Qt 中,所有 DOM 节点的类型名字都以 QDom 开头,因此,QDomElement就是 Element 节点,QDomText就是 Text 节点。不同类型的节点则有不同类型的子节点。例如,Element 节点允许包含其它 Element 节点,也可以是其它类型。
程序运行效果图:
生成的XML文件:
源代码:
#ifndef XMLGENERATOR_H
#define XMLGENERATOR_H
#include <QMainWindow>
#include <QTreeWidgetItem>
#include <QEvent>
#include <QDomDocument>
namespace Ui {
class XmlGenerator;
}
class XmlGenerator : public QMainWindow
{
Q_OBJECT
public:
explicit XmlGenerator(QWidget *parent = 0);
~XmlGenerator();
void InitUi();
bool GenerateXML();
protected:
bool eventFilter(QObject *obj, QEvent *event);
private slots:
void CurrentItemChangedSlot(QTreeWidgetItem *current);
void on_btn_addItem_clicked();
void on_btn_addChildItem_clicked();
void on_btn_delItem_clicked();
void on_btn_GenerateXML_clicked();
void on_btn_up_clicked();
void on_btn_down_clicked();
void on_btn_changeToFather_clicked();
void on_btn_changeToChild_clicked();
private:
Ui::XmlGenerator *ui;
QTreeWidgetItem *rootItem;
QDomDocument doc;
};
#endif // XMLGENERATOR_H
#include "XmlGenerator.h"
#include "ui_xmlgenerator.h"
#include <QDebug>
#include <QDomText>
#include <QDomElement>
#include <QFileDialog>
#include <QMessageBox>
XmlGenerator::XmlGenerator(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::XmlGenerator)
{
ui->setupUi(this);
InitUi();
rootItem = new QTreeWidgetItem;
connect(ui->treeWidget, &QTreeWidget::currentItemChanged, this, &XmlGenerator::CurrentItemChangedSlot);
}
XmlGenerator::~XmlGenerator()
{
delete ui;
}
void XmlGenerator::InitUi()
{
/*如果采用设置样式表的方式给按钮添加图片,则按钮的形态会消失,比如,按钮没有边框
ui->btn_addItem->setStyleSheet("QPushButton{border-image: url(:/new/prefix1/image/添加1.png);}"
"QPushButton:hover{border-image: url(:/new/prefix1/image/添加2.png);}");
ui->btn_addChildItem->setStyleSheet("QPushButton{border-image: url(:/new/prefix1/image/添加子项1.png);}"
"QPushButton:hover{border-image: url(:/new/prefix1/image/添加子项2.png);}");
ui->btn_delItem->setStyleSheet("QPushButton{border-image: url(:/new/prefix1/image/减号1.png);}"
"QPushButton:hover{border-image: url(:/new/prefix1/image/减号2.png);}");
ui->btn_up->setStyleSheet("QPushButton{border-image: url(:/new/prefix1/image/上1.png);}"
"QPushButton:hover{border-image: url(:/new/prefix1/image/上2.png);}");
ui->btn_down->setStyleSheet("QPushButton{border-image: url(:/new/prefix1/image/下1.png);}"
"QPushButton:hover{border-image: url(:/new/prefix1/image/下2.png);}");
ui-&g