当前位置: 首页 > news >正文

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);
}

相关文章:

  • 《数字图像处理-OpenCV/Python》第15章:图像分割
  • IDEA 2023.3.6 下载、安装、激活与使用
  • 碳微球是新型碳材料 在高科技领域应用价值极高
  • Re0:从零开始的C++游戏开发【中】
  • 计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)
  • Java学习19-List、set容器
  • 【云原生 | 60】Docker中通过docker-compose部署kafka集群
  • python-web应用程序-Django-From组件
  • jeecg dictText字典值
  • C++:栈(stack)、队列(queue)、优先级队列(priority_queue)
  • 【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)
  • Java算法篇之二分查找模板
  • C++ Thread多线程并发记录(3)线程创建总结
  • 基础—SQL—DML(数据操作语言)修改和删除
  • 力扣----轮转数组
  • JavaScript-如何实现克隆(clone)函数
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【技术性】Search知识
  • java中的hashCode
  • leetcode46 Permutation 排列组合
  • LeetCode算法系列_0891_子序列宽度之和
  • linux学习笔记
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React组件设计模式(一)
  • spring boot下thymeleaf全局静态变量配置
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 应用生命周期终极 DevOps 工具包
  • 在Unity中实现一个简单的消息管理器
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ‌移动管家手机智能控制汽车系统
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (6)设计一个TimeMap
  • (C语言)字符分类函数
  • (NSDate) 时间 (time )比较
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)原生js案例之数码时钟计时
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm码农论坛 毕业设计 231126
  • (七)glDrawArry绘制
  • (循环依赖问题)学习spring的第九天
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .cfg\.dat\.mak(持续补充)
  • .gitignore文件忽略的内容不生效问题解决
  • .Net Core 中间件验签
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Framework .NET Core与 .NET 的区别