子类化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;
}
以下是用法:
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的属性的更多相关文章
- C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案
C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案 xml序列化涉及到XmlRoot,XmlInclude,XmlElement,XmlAttribute,XmlType ...
- C++ 中超类化和子类化常用API
在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWi ...
- 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的
1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...
- Win32中安全的子类化(翻译)
关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe ...
- C++ 中超类化和子类化
超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建 ...
- php 修改、增加xml结点属性的实现代码
php修改xml结点属性,增加xml结点属性的代码,有需要的朋友可以参考下 php 修改 增加xml结点属性的代码,供大家学习参考.php修改xml结点属性,增加xml结点属性的代码,有需要的朋友,参 ...
- 从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类
一.关于起因 之前发过一篇博文,是关于VB6中跟踪鼠标移出事件的示例(http://www.cnblogs.com/alexywt/p/5891827.html) 随着业务状况的不断发展,提出了更多的 ...
- Vue小案例 之 商品管理------修改商品数量以及增加入库日期属性
实现修改商品的数量: 加入的代码: css: .clear-btn{ text-align: right; padding-right: 10px; } .table-warp a{ text-dec ...
- 子类化GetOpenFileName/GetSaveFileName, 以及钩子函数OFNHookProc的使用的简要说明
昨天, 群里面有一个人问起: 要怎么让"文件打开对话框"居中显示, 有人说子类. 而我告诉他的方法是用钩子函数OFNHookProc, 不知道这是不是所谓的子类?相信看了我今天这篇 ...
随机推荐
- go语言之进阶篇通过switch实现类型断言
1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...
- Java系列:使用软引用构建敏感数据的缓存
一.为什么需要使用软引用 首先,我们看一个雇员信息查询系统的实例.我们将使用一个Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库中的雇员人事档案信息.作为一个用户,我们完全有可能需 ...
- 混合开发 Hybird Ionic Angular Cordova web 跨平台 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- ORM数据库框架 SQLite 常用数据库框架比较 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 深度学习(Deep Learning)算法简介
http://www.cnblogs.com/ysjxw/archive/2011/10/08/2201782.html Comments from Xinwei: 最近的一个课题发展到与深度学习有联 ...
- 使用SVD方法实现电影推荐系统
http://blog.csdn.net/zhaoxinfan/article/details/8821419 这学期选了一门名叫<web智能与社会计算>的课,老师最后偷懒,最后的课程pr ...
- linux命令学习——ps
1.命令简介 ps命令用来查看系统上的进程信息.要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定 ...
- xshell tunnel的使用
原文:https://www.jianshu.com/p/388a93b1e7f7 https://blog.csdn.net/qq_34039315/article/details/77510923 ...
- w3cscholl的在线代码编辑工具2
https://www.w3cschool.cn/tryrun/runcode?lang=c
- sqrt函数的实现
原文:http://blog.csdn.net/legend050709/article/details/39394381 sqrt算法实现: (一)int sqrt1(int n);求取整数x的平方 ...