子类化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