zoukankan      html  css  js  c++  java
  • 子类化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 
     id: %2 
     address: %3 
     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

  • 相关阅读:
    【工具】使用Google搜索的一些技巧
    git merge和rebase合并分支的区别
    《人月神话》读后感
    记录 Vue 中遇见的坑
    chrome信任http
    sed命令替换配置文件
    中控考勤机IP能ping通,但是同过接口连接不上的解决版本
    如何启动解压版的Tomcat6.0
    服务器获取客户端ip
    linux 增加权限
  • 原文地址:https://www.cnblogs.com/foohack/p/7563115.html
Copyright © 2011-2022 走看看