QTreeWidget的Item根据xml文件创建

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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡云辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值