子类化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, 不知道这是不是所谓的子类?相信看了我今天这篇 ...
随机推荐
- verilog语法实例学习(10)
常用的时序电路介绍 T触发器和JK触发器 在D触发器输入端添加一些简单的逻辑电路,可以生成另一种类型的存储元件.比如下图所示的T触发器.该电路有一个上升沿触发的触发器和两个与门,一个或门,以及一个反相 ...
- Redhat Linux NFS配置
Linux下,All deviceis file,所有的设备都是文件.当我们需要把某些文件夹就或者文件共享给其他用户,就可以使用网络文件系统. 本文介绍Redhat Linux下的NFS配置. 在使用 ...
- mysql 5.1简明教程
第一章Mysql简介与安装 第一节 MySql简介 百度百科 第二节 MySql安装与配置 1.MySql5.1下载及安装 2.MySql数据库编码配置 UTF-8 3.MySql图形页面sqlyog ...
- 【转载】神奇的css属性pointer-events
绝对定位元素盖住链接或添加某事件handle的元素后,那么该链接的默认行为(页面跳转)或元素事件将不会被触发.现在Firefox3.6+/Safari4+/Chrome支持一个称为pointer-ev ...
- xgboost入门与实战
xgboost入门与实战(实战调参篇) https://blog.csdn.net/sb19931201/article/details/52577592 前言 前面几篇博文都在学习原理知识,是时候上 ...
- Eclipse技术: 项目文件中过滤.o文件
1. 右建项目 -> Properties. 2. 增加过滤规则
- HttpWebRequest抓取网页数据返回异常:远程服务器返回错误: (503) 服务器不可用
解决方法: HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webURL); //声明一个H ...
- VC++ MFC应用程序项目文件2.cpp
//GameServer.cpp: 定义应用程序的入口点. // #include "stdafx.h" #include "GameServer.h" #de ...
- 基于PHP构建OAuth 2.0 服务端 认证平台
OAuth2.0 认证服务 安装 你可以在github上下载OAuth Server PHP,也可以用下列命令下载,不过内容都是一样的 mkdir my-oauth2-walkthrough cd m ...
- [Canvas]人物型英雄出现(前作仅为箭头)
源码点此下载,用浏览器打开index.html观看. 代码: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...