因为有需求是点击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;
}

以下是用法:

 void OrgTree::appendChildToTreeItem(OrgTreeWidgetItem* item, const OrgTreeNode& node)
{
OrgTreeWidgetItem* child = new OrgTreeWidgetItem(QStringList() << QString::fromStdString(node.name));
child->setOrgId(QString(node.id.c_str()));
child->setOrgName(QString(node.name.c_str()));
child->setOrgAddress(QString(node.addr.c_str()));
child->setOrgDescription(QString(node.description.c_str()));
item->addChild(child); auto childs = m_parser->findChildsById(node.id);
for (auto childNode : childs)
{
appendChildToTreeItem(child, childNode);
}
}

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

  connect(ui.treeWidget, &QTreeWidget::itemClicked,
this, &OrgTree::slotItemClicked);
connect(ui.treeWidget, &QTreeWidget::itemDoubleClicked,
this, &OrgTree::slotItemDoubleClicked); void OrgTree::slotItemClicked(QTreeWidgetItem *item, int column)
{
auto test = dynamic_cast<OrgTreeWidgetItem*>(item);
if (test)
{
QString name = test->getOrgName();
QString id = test->getOrgId();
QString addr = test->getOrgAddress();
QString description = test->getOrgDescription(); QString format = QString("name: %1 \r\n id: %2 \r\n address: %3 \r\n description: %4").arg(name)
.arg(id).arg(addr).arg(description); ui.plainTextEdit->setPlainText(format);
}
} void OrgTree::slotItemDoubleClicked(QTreeWidgetItem *item, int column)
{
auto test = dynamic_cast<OrgTreeWidgetItem*>(item);
if (test)
{
QString name = test->getOrgName();
QString id = test->getOrgId(); }
}

references:

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

子类化QTreeWidgetItem实现增加Item的属性的更多相关文章

  1. C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案

    C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案 xml序列化涉及到XmlRoot,XmlInclude,XmlElement,XmlAttribute,XmlType ...

  2. C++ 中超类化和子类化常用API

    在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...

  3. 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的

    1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...

  4. Win32中安全的子类化(翻译)

    关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe ...

  5. C++ 中超类化和子类化

    超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建 ...

  6. php 修改、增加xml结点属性的实现代码

    php修改xml结点属性,增加xml结点属性的代码,有需要的朋友可以参考下 php 修改 增加xml结点属性的代码,供大家学习参考.php修改xml结点属性,增加xml结点属性的代码,有需要的朋友,参 ...

  7. 从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类

    一.关于起因 之前发过一篇博文,是关于VB6中跟踪鼠标移出事件的示例(http://www.cnblogs.com/alexywt/p/5891827.html) 随着业务状况的不断发展,提出了更多的 ...

  8. Vue小案例 之 商品管理------修改商品数量以及增加入库日期属性

    实现修改商品的数量: 加入的代码: css: .clear-btn{ text-align: right; padding-right: 10px; } .table-warp a{ text-dec ...

  9. 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明

    昨天, 群里面有一个人问起: 要怎么让"文件打开对话框"居中显示, 有人说子类. 而我告诉他的方法是用钩子函数OFNHookProc, 不知道这是不是所谓的子类?相信看了我今天这篇 ...

随机推荐

  1. WebFormViewEngine及用户控件寻址bug

    在做我的网站的时候遇到了主题切换的问题,特总结与大家共享. 熟悉asp.net mvc的朋友都知道,mvc中,默认情况下视图都在views文件夹下放着.要想改变文件必须重写WebFormViewEng ...

  2. ESP32那些事儿(六):功能开发之蓝牙及WiFi功能

    蓝牙和WIFI是ESP32的核心功能,蓝牙和wifi的共存也是esp32的独门武功,但时候后续也会发现共存的时候会有很多问题.不管怎样,蓝牙和wifi在esp-idf中有很多的例子,大家都可以参考.本 ...

  3. [leetcode]Minimum Path Sum @ Python

    原题地址:https://oj.leetcode.com/problems/minimum-path-sum/ 题意: Given a m x n grid filled with non-negat ...

  4. 自定义View 水印布局 WaterMark 前景色 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. Java 读取 .properties 配置文件

    java 开发中,经常要读取 properties 配置文件,下面介绍几种读取方式: 1.基于 InputStream 读取配置文件 该方式的优点在于可以读取任意路径下的配置文件 Properties ...

  6. 【Scala】Scala-使用ExecutorService-等待所有线程完成

    Scala-使用ExecutorService-等待所有线程完成 scala ExecutorService 等待_百度搜索 使用ExecutorService,如何等待所有线程完成,?_java_帮 ...

  7. Arrow functions and the ‘this’ keyword

    原文:https://medium.freecodecamp.org/learn-es6-the-dope-way-part-ii-arrow-functions-and-the-this-keywo ...

  8. Oracle中对数字加汉字的排序(完好)

    之前写过一篇 Oracle中对数字加汉字的排序以及REGEXP_SUBSTR介绍 后来在开发的过程中又遇到相似问题.数据不一样了,按之前的使用方法是不适用的. 之前的是数字在前汉字在后,最基本的差别是 ...

  9. oauth2-server-php-docs 概念

    PHP的OAuth2服务器库 将OAuth2.0干净地安装到您的PHP应用程序中. 从GitHub 下载代码开始. 要求 这个库需要PHP 5.3.9+.然而,有一个稳定的版本和开发分支的PHP 5. ...

  10. Python代码规范(PEP8)问题及解决

    转载:https://blog.csdn.net/Jason_Lewis/article/details/75386598 最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代 ...