QTreeWidget作为一个树形控件,若是每一个项(QTreeWidgetItem)通过手写代码进行创建,较为麻烦,尤其层数较多的情况下,且无重用性。
若将树形控件所挂内容编写在xml文中,xml文件正好是一个存储树形数据的文本文件,用来保存QTreeWidget的配置信息,再合适不过。
以下是我自己写的一个如何从xml文件读取树形数据(或者说是具有层次的数据)并在QTreeWidget控件上创建Item的类。
请注意:该类继承自QTreeWidget和ReadWriteXml。由于ReadWriteXml中引用了读写xml的第三方类,文件较多,单独进行了上传,见读写xml的c++类
#ifndef XMLTREEWIDGET_H
#define XMLTREEWIDGET_H
#include <QTreeWidget>
#include"readwritexml.h"
class XmlTreeWidget : public QTreeWidget,public ReadWriteXml
{
Q_OBJECT
public:
explicit XmlTreeWidget(QWidget *parent = nullptr);
XmlTreeWidget(const QString &xmlPath,QWidget *parent = nullptr);
protected:
void readXmlRootElement(const TiXmlElement* rootElement); //从根节点开始读xml
void writeXmlRootElement(TiXmlElement* rootElement);
private:
void createItem(const TiXmlElement* element,QTreeWidgetItem* item);
signals:
private:
QString m_iconDir;
};
#endif // XMLTREEWIDGET_H
#include "xmltreewidget.h"
#include<QApplication>
#include<QDebug>
XmlTreeWidget::XmlTreeWidget(QWidget *parent) : QTreeWidget(parent)
{
setHeaderHidden(true);
setSelectionBehavior(QAbstractItemView::SelectItems);
setSelectionMode(QAbstractItemView::SingleSelection);
m_iconDir=QApplication::applicationDirPath();
}
XmlTreeWidget::XmlTreeWidget(const QString &xmlPath, QWidget *parent)
: QTreeWidget(parent)
{
setHeaderHidden(true);
readXmlFile(xmlPath);
expandAll();
}
void XmlTreeWidget::readXmlRootElement(const TiXmlElement *rootElement)
{
//读出图标文件的路径
m_iconDir+=rootElement->Attribute("IconFilePath");
// qDebug()<<"m_iconDir="<<m_iconDir;
const TiXmlElement* childElement=rootElement->FirstChildElement("Control");
if(childElement)
{
//顶级节点
const char* controlName=childElement->Attribute("Name");
QTreeWidgetItem* rootItem=new QTreeWidgetItem;
rootItem->setText(0,controlName);
QString iconPath=m_iconDir+childElement->Attribute("Icon");
rootItem->setIcon(0,QIcon(iconPath));
rootItem->setCheckState(0,Qt::Checked);
insertTopLevelItem(0,rootItem);
//后代节点
createItem(childElement,rootItem);
}
}
void XmlTreeWidget::writeXmlRootElement(TiXmlElement *rootElement)
{
}
void XmlTreeWidget::createItem(const TiXmlElement *element, QTreeWidgetItem *item)
{
const TiXmlElement* childElement=element->FirstChildElement("Control");
while (childElement)
{
const char* controlName=childElement->Attribute("Name");
QTreeWidgetItem* childItem=new QTreeWidgetItem(item);
item->addChild(item);
childItem->setText(0,controlName);
QString iconPath=m_iconDir+childElement->Attribute("Icon");
childItem->setIcon(0,QIcon(iconPath));
childItem->setCheckState(0,Qt::Checked);
createItem(childElement,childItem); //后代节点
//兄弟节点
childElement=childElement->NextSiblingElement("Control");
}
}