子类化QTreeWidgetItem实现增加Item的属性

因为有需求是点击QTreeWidgetItem需要获取该Item的节点的相关属性,Item需要保存关联的属性,那么就需要扩展QTreeWidgetItem,当然,C++中扩展修改一个类或组件的方式就是继承了,

然后创建子类化的类的实例,就可以添加进QTreeWidget了,以下是子类化的代码:

///////////////////////////////H文件/////////////////////////////////
#pragma once

#include <QTreeWidgetItem>
#include <QStringList>
#include <QObject>

class OrgTreeWidgetItem : public QObject, public QTreeWidgetItem
{

    Q_OBJECT
public:
    OrgTreeWidgetItem(OrgTreeWidgetItem *parent);
    OrgTreeWidgetItem(OrgTreeWidgetItem *parent, const QStringList& list);
    OrgTreeWidgetItem(const QStringList& list);
    ~OrgTreeWidgetItem();

    void setOrgId(const QString& id);
    void setOrgName(const QString& name);
    void setOrgAddress(const QString& addr);
    void setOrgDescription(const QString& desc);

    QString getOrgId() const;
    QString getOrgName() const;
    QString getOrgAddress() const;
    QString getOrgDescription() const;
public: 
    QString m_orgId;
    QString m_orgName;
    QString m_orgAddress;
    QString m_orgDescription;
};

/////////////////////////////CPP实现文件////////////////////////////
OrgTreeWidgetItem::OrgTreeWidgetItem(OrgTreeWidgetItem *parent)
    : QTreeWidgetItem(parent)
{
}

OrgTreeWidgetItem::OrgTreeWidgetItem(OrgTreeWidgetItem *parent, const QStringList& list)
    : QTreeWidgetItem(parent,list)
{

}

OrgTreeWidgetItem::OrgTreeWidgetItem(const QStringList& list)
    : QTreeWidgetItem(list)
{

}

OrgTreeWidgetItem::~OrgTreeWidgetItem()
{
}

void OrgTreeWidgetItem::setOrgId(const QString& id)
{
    m_orgId = id;
}

void OrgTreeWidgetItem::setOrgName(const QString& name)
{
    m_orgName = name;
}

void OrgTreeWidgetItem::setOrgAddress(const QString& addr)
{
    m_orgAddress = addr;
}

void OrgTreeWidgetItem::setOrgDescription(const QString& desc)
{
    m_orgDescription = desc;
}

QString OrgTreeWidgetItem::getOrgId() const
{
    return m_orgId;
}

QString OrgTreeWidgetItem::getOrgName() const
{
    return m_orgName;
}

QString OrgTreeWidgetItem::getOrgAddress() const
{
    return m_orgAddress;
}

QString OrgTreeWidgetItem::getOrgDescription() const
{
    return m_orgDescription;
}

 

以下是用法:

 1 void OrgTree::appendChildToTreeItem(OrgTreeWidgetItem* item, const OrgTreeNode& node)
 2 {
 3     OrgTreeWidgetItem* child = new OrgTreeWidgetItem(QStringList() << QString::fromStdString(node.name));
 4     child->setOrgId(QString(node.id.c_str()));
 5     child->setOrgName(QString(node.name.c_str()));
 6     child->setOrgAddress(QString(node.addr.c_str()));
 7     child->setOrgDescription(QString(node.description.c_str()));
 8     item->addChild(child);
 9 
10     auto childs = m_parser->findChildsById(node.id);
11     for (auto childNode : childs)
12     {
13         appendChildToTreeItem(child, childNode);
14     }
15 }

这样就可以复用QTreeWidget的信号了,单击Item就跳转到相应的槽函数,就为以后弹出上下文菜单增加,删除节点做好了准备:

 1  connect(ui.treeWidget, &QTreeWidget::itemClicked,
 2         this, &OrgTree::slotItemClicked);
 3     connect(ui.treeWidget, &QTreeWidget::itemDoubleClicked,
 4         this, &OrgTree::slotItemDoubleClicked);
 5 
 6 void OrgTree::slotItemClicked(QTreeWidgetItem *item, int column)
 7 {
 8     auto test = dynamic_cast<OrgTreeWidgetItem*>(item);
 9     if (test)
10     {
11         QString name = test->getOrgName();
12         QString id = test->getOrgId();
13         QString addr = test->getOrgAddress();
14         QString description = test->getOrgDescription();
15 
16         QString format = QString("name: %1 \r\n id: %2 \r\n address: %3 \r\n description: %4").arg(name)
17             .arg(id).arg(addr).arg(description);
18 
19         ui.plainTextEdit->setPlainText(format);
20     }
21 }
22 
23 void OrgTree::slotItemDoubleClicked(QTreeWidgetItem *item, int column)
24 {
25    auto test = dynamic_cast<OrgTreeWidgetItem*>(item);
26     if (test)
27     {
28         QString name = test->getOrgName();
29         QString id = test->getOrgId();
30        
31     }
32 }

 

references:

https://stackoverflow.com/questions/28824494/how-to-used-itemexpanded-with-a-subclass-of-qtreewidgetitem

 

posted @ 2017-09-20 18:59  foo__hack  阅读(1451)  评论(0编辑  收藏  举报