在上一篇博客中,我们介绍了如何生成一个XML文件,今天我们利用生成的XML文件来进行解析并设计出多级关联菜单。在以前的文章中解决了如何生成二级菜单,不过之前的方法过于笨重,采用手动添加代码的方式,不仅代码重复率高而且不利于修改(维护)。所以,今天我们换用读XML的方式再次解决这个问题。
本打算采用model/view架构加下拉框列表设计为下拉表格的形式,但是遇到一个问题,下拉框的currentIndex始终无法正确的设置,它默认把表格的一行当成一个Item,所有当鼠标选择了table中的某一个数据时,comboBox的值始终是选中的数据所在行的第一列。晕,只好采用原始的下拉列表来做了。
效果图大致如下:我们先选择一个XML文件,这个XML文件就是我们前面一篇博客中生成的。此时,XML文件会被解析并将结果写入两个TXT文件中,在通过加载按钮将文件内容展示出来。这里我们使用了文件来做一次中转,实际上不用文件,也完全可以直接将XML的内容解析出来并展示,但是生成一个本地文件有个好处就是:我们不用每次打开程序都要去解析这个XMl文件,只要这个XML文件没有发生变化,我们就可以只解析一次,后面都直接读取文件即可。
程序源代码:
ParseXML.h
#ifndef PARSEXML_H
#define PARSEXML_H
//#include "ComboBoxTableView.h"
#include "TableModel.h"
#include "TableView.h"
#include <QMainWindow>
#include <QList>
#include <QStringList>
#include <QDomElement>
#include <QTableWidget>
#include <QComboBox>
namespace Ui {
class ParseXML;
}
class ParseXML : public QMainWindow
{
Q_OBJECT
public:
explicit ParseXML(QWidget *parent = 0);
~ParseXML();
void ParseProvincesElement(const QDomElement &rootElement);
void ParseCityElement(const QDomElement &element);
void ParseDistrictElement(const QDomElement &element);
void WriteFile(const QString &fileName, const QStringList &list);
void WriteFile(const QString &fileName, const QList<QStringList> &list);
void ReadFile();
// void LoadCity();
// void LoadDistrict();
void LoadComboBox(QComboBox *comboBox, const QStringList &list);
private slots:
void on_btn_choose_file_clicked();
void on_btn_load_clicked();
void currentIndexChanged_comboBox_1(const QString &text);
void currentIndexChanged_comboBox_2(const QString &text);
private:
Ui::ParseXML *ui;
QStringList provincesList;
QStringList cityList;
QStringList districtList;
QStringList stringList_p