QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox,可参见下面这篇文章
QT之动态加载下拉框(QComboBox)

同理QTreeWidget也可以实现动态加载,在一些异步加载数据,并且数据加载比较耗时,非常实用。

效果

在这里插入图片描述
原理分析
要实现此类效果,要拆解下功能项:
第一步,自定义绘制树的分支图标

//查询qt文档,drawBranches接口可以实现自定义绘制分支图标
virtual void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const

第二步,绘制一个动态图标显示在原来的分支图标上。

源码

TreeWidget.h

class TreeWidget : public QTreeWidget
{Q_OBJECT
public:explicit TreeWidget(QWidget* parent = nullptr);virtual ~TreeWidget();/*** @brief setGifPath* 设置动态图片路径* @param _path*/void setGifPath(const QString& _path);/*** @brief startMovie* 开始动画*/void startMovie();/*** @brief stopMovie* 停止播放动画*/void stopMovie();protected:virtual void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const override;private:QMovie *m_movie = nullptr;};

TreeWidget.cpp

TreeWidget::TreeWidget(QWidget *parent)
{m_movie = new QMovie(this);connect(m_movie,&QMovie::updated,this,[this](const QRect& rect){this->viewport()->update();});
}TreeWidget::~TreeWidget()
{if(nullptr != m_movie){m_movie->deleteLater();}
}//设置动态图片路径
void TreeWidget::setGifPath(const QString &_path)
{m_movie->setFileName(_path);
}//开始播放动画
void TreeWidget::startMovie()
{if(nullptr != m_movie){m_movie->start();}
}//停止播放动画
void TreeWidget::stopMovie()
{if(nullptr != m_movie){m_movie->stop();}this->viewport()->update();
}//绘制分支
void TreeWidget::drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const
{bool _isload = index.data(Qt::UserRole + 1).toBool();if(!_isload){return QTreeWidget::drawBranches(painter,rect,index);}if(nullptr == m_movie){return;}int w = this->indentation();auto top = rect.topRight();top.setX(top.x() - w);QRect _rect(top,rect.bottomRight());QPixmap _pix = m_movie->currentPixmap();_pix = _pix.scaled(_rect.size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);painter->drawPixmap(_rect,_pix);}

使用

//先构建树
m_tree = new TreeWidget(this);
m_tree->setHeaderHidden(true);
m_tree->setGifPath(":/icon/imgs/loading.gif");QTreeWidgetItem* item = new QTreeWidgetItem({"root"});
m_tree->addTopLevelItem(item);QHBoxLayout* _layout = new QHBoxLayout(this);
this->setLayout(_layout);
_layout->addWidget(m_tree);connect(m_tree,&TreeWidget::itemClicked,this,&CusBranchTreeWidget::slot_itemClicked);//槽函数及模拟耗时操作
void CusBranchTreeWidget::slot_itemClicked(QTreeWidgetItem *item,int col)
{if(item->childCount() != 0){return;}item->setData(0,Qt::UserRole + 1,true);m_tree->startMovie();//模拟加载数据addChildItems(item);
}//模拟加载数据
void CusBranchTreeWidget::addChildItems(QTreeWidgetItem *parentItem)
{QVector<QTreeWidgetItem*> items;for(int i = 0; i < 5; i++){auto uid = QUuid::createUuid().toString();auto item = new QTreeWidgetItem({uid.left(5)});items << item;//模拟耗时操作QEventLoop _loop;QTimer::singleShot(500,&_loop,&QEventLoop::quit);_loop.exec();}for(auto& it : items){parentItem->addChild(it);}//停止加载动画parentItem->setData(0,Qt::UserRole + 1,false);m_tree->stopMovie();m_tree->expandItem(parentItem);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker镜像转移,mac Linux

起因是镜像在互联网&#xff0c;而公司内网没有网络&#xff0c;需要跨平台转移&#xff0c;且系统不一样&#xff0c;一个Arm,一个linux。正常进行后&#xff0c;报错系统编译问题&#xff0c;特将处理过程总结一下 在 mac在pull镜像的时候需要设置参数&#xff0c;确保下载的…

数字展示具有广阔发展空间 市场规模保持增长态势

数字展示具有广阔发展空间 市场规模保持增长态势 数字展示是指以数字图像为核心&#xff0c;将触摸屏、红外线感应器、三维数字图像等相结合的高层次展示行业。与传统展示方式相比&#xff0c;数字展示能够突破时间、空间及形态的局限&#xff0c;将文字、图像等各种信息转化为…

Qwen 微调LoRA之后合并模型,使用 webui 测试

Qwen 微调LoRA之后合并模型 qwen_lora_merge.py &#xff1a; import os from peft import AutoPeftModelForCausalLM from transformers import AutoTokenizerdef save_model_and_tokenizer(path_to_adapter, new_model_directory):"""加载模型&#xff0c;合…

vue 封装水球图

1、 安装 echarts 与 echarts-liquidfill pnpm i echarts pnpm i echarts-liquidfill 2、组件中引入 import * as echarts from echarts import echarts-liquidfill 3、封装通用组件 <div class"waterball-chart"><div ref"chartContainer" s…

天线对信号传输的效率影响

天线设计和选择的标准主要包括带宽、极化、方向性、物理空间和增益等方面。这些标准直接影响信号传输的效率和质量。 带宽是指特定信号的频率范围&#xff0c;它决定了天线能够覆盖的频率范围&#xff0c;从而影响信号的传输效率。极化是指天线辐射的电场方向&#xff0c;不同的…

使用 Vue 3 和 qrcode.js 开发二维码显示组件

二维码在现代应用中广泛使用&#xff0c;例如支付、身份验证、链接分享等。本文将介绍如何使用 Vue 3 和 qrcode.js 库来创建一个灵活的二维码显示组件&#xff0c;并展示如何在应用中使用它。 1. 安装必要的依赖 首先&#xff0c;我们需要安装 Vue 3 和 qrcode.js。如果你还…

从C到C++,C++入门篇(1)

1.什么是C C是一种通用编程语言&#xff0c;由Bjarne Stroustrup在1980年代初开发&#xff0c;作为C语言的扩展。 C支持多种编程范式&#xff0c;包括过程式编程、数据抽象、面向对象编程和泛型编程等。 这种语言在操作系统、游戏开发、图形界面、嵌入式系统、分布式系统、网…

变压器中的磁化和励磁电流波形

导出变压器中的磁化电流和励磁电流的图形方法具有说明性&#xff0c;因为它们使我们能够同时可视化产生这些波形的元素&#xff0c;例如磁通波形和磁性材料的典型 BH 曲线。 所得波形表明它们不是正弦波&#xff0c;并且对于励磁电流而言&#xff0c;它也不对称。 使用傅里叶…

vue2源码重写数组方法学习

在学习之前&#xff0c;我们需要问一个为什么&#xff0c;为什么vue2 源码要重写数组方法 响应式数据更新&#xff1a;通过重写数组方法&#xff0c;Vue 能够捕获对数组的变更操作&#xff08;如 push、pop、shift 等&#xff09;&#xff0c;并在数据发生变化时自动更新视图&a…

Facebook代运营 | Facebook广告投放步骤及要点

Facebook体量大&#xff0c;素材的更新频率快&#xff0c;通过Facebook进行广告投放的用户也越来越多&#xff0c;Facebook坐拥大量用户&#xff0c;同时有着非常科学的用户画像构建系统和推送机制&#xff0c;对于很多广告涉足的伙伴来说&#xff0c;更加的友好。 1. 创建广告…

Opentracing 代码Demo

背景 OpenTracing 是一个提供标准化分布式追踪功能的API和工具。它的主要作用包括: 跨系统边界追踪请求流程:OpenTracing 允许开发者跟踪一个请求从开始到结束在整个分布式系统中的所有经过的点(包括异构系统),帮助理解系统中的请求流程和服务间的相互依赖。 性能分析和瓶…

ubuntu系统 kubeadm方式搭建k8s集群

服务器环境与要求&#xff1a; 三台服务器 k8s-master01 192.168.26.130 操作系统&#xff1a; Ubuntu20.04 k8s-woker01 192.168.26.140 操作系统&#xff1a; Ubuntu20.04 k8s-woker02 192.168.26.150 操作系统&#xff1a; Ubuntu20.04 最低配置&#xff1a;2…

斯坦福 AI 团队被曝抄袭中国大模型开源成果;Zoom 创始人谈视频会议未来丨 RTE 开发者日报 Vol.218

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

gradio出现httpcore.ReadTimeout: timed out问题

解决办法 pip install https://gradio-builds.s3.amazonaws.com/aae46d9199e1edc8a22c96aba1ade12f6ebc1da1/gradio-4.21.0-py3-none-any.whl

2.29G大小Win 11系统来了,老爷机也能焕发第二春

Win 11 推出近三年以来微软大搞特搞的份额入侵计划&#xff0c;以目前情况来看算是彻底失败了。 国外知名机构 statcounter 最近公布了 4 月份 Windows 各版本份额调查结果。 其中显示&#xff0c;Win 11 占比 26% 左右&#xff0c;相较 2 月份 28% 反而开起了倒滑车。 来源&…

技术管理革新:三品PLM在电子电气行业的应用

随着科技的不断进步和市场需求的日益增长&#xff0c;电子电气行业正经历着前所未有的变革。产品生命周期的缩短和更新换代的加速&#xff0c;对企业的产品研发管理提出了更高的要求。在这样的背景下&#xff0c;产品生命周期管理PLM解决方案应运而生&#xff0c;旨在帮助电子电…

Python工程中,__init__.py文件有什么用

在Python工程中&#xff0c;__init__.py 文件有几个重要的用途&#xff1a; 标识目录为包&#xff1a; 在Python 3.3之前&#xff0c;__init__.py 文件的存在是为了告诉解释器&#xff0c;该目录是一个Python包。这使得包中的模块可以被导入和使用。即使在Python 3.3之后可以没…

隔离变压器的特点与作用

隔离变压器是一种常见的电力变压器&#xff0c;其主要特点和作用如下&#xff1a; 特点&#xff1a; 电气隔离&#xff1a; 隔离变压器的主要特点是将输入端和输出端完全电气隔离&#xff0c;通过磁耦合实现能量传递。这意味着输入端和输出端之间没有直接的电连接&#xff0c…

endswith方法 测试字符串是否以指定的后缀结束

Java String类中的endswith方法 Java String类 endsWith () 方法用于测试字符串是否以指定的后缀结束。 语法 public boolean endsWith (String suffix) 参数 suffix -- 指定的后缀。 返回值 如果参数表示的字符序列是此对象表示的字符序列的后缀&#xff0c;则返回 true&…

基于数据帧进行SQL查询

本教程将通过一个具体的案例来演示如何在Spark SQL中基于数据帧进行SQL查询。我们将从创建临时视图开始&#xff0c;然后使用spark对象执行SQL查询&#xff0c;包括投影、选择、统计和排序等操作。 具体步骤如下&#xff1a; 基于数据帧创建临时视图&#xff1a; 命令格式&…