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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][图像分类]骨关节炎严重程度分类数据集14038张4分类

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;14038 分类类别数&#xff1a;4 类别名称:[“grade0”,“grade2”,“grade3…

如何使用KolorPanotourPro制作全景图像网页

目录 前言 KolorPanotourPro是什么 如何制作全景网页 1.拥有全景图 2.导入图片 3.在多张全景图中跳转 4.查看制作的全景网页 结束语 前言 今天是坚持写博客的第十五天&#xff0c;继续为努力和坚持的大家点赞和鼓掌。 书接上文&#xff0c;我们讲了如何使用如何使用A…

公园【百度之星】/图论+dijkstra

公园 图论dijkstra #include<bits/stdc.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; vector<ll> v[40005]; //a、b、c分别是小度、度度熊、终点到各个点的最短距离 ll a[40005],b[40005],c[40005],dist[40005],st[40005]; void…

1.1 OpenCV随手简记(一)

OpenCV学习篇 OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉库&#xff0c;它提供了大量的算法和函数&#xff0c;用于图像处理、计算机视觉和机器学习等领域。 1. OpenCV 简介 1.1 OpenCV 的起源和发展 OpenCV 项目始于 1999 年&#xff0c;由 In…

IDeal下的SpringBoot项目部署

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…

制作ChatPDF之Elasticsearch8.13.4搭建(一)

Elasticsearch8.x搭建 在Windows系统上本地安装Elasticsearch的详细步骤如下&#xff1a; 1. 下载Elasticsearch 访问 Elasticsearch下载页面。选择适用于Windows的版本8.13.4&#xff0c;并下载ZIP文件。 2. 解压文件 下载完成后&#xff0c;找到ZIP文件&#xff08;例如…

【2023百度之星初赛】跑步,夏日漫步,糖果促销,第五维度,公园,新材料,星际航行,蛋糕划分

目录 题目&#xff1a;跑步 思路&#xff1a; 题目&#xff1a;夏日漫步 思路&#xff1a; 题目&#xff1a;糖果促销 思路&#xff1a; 题目&#xff1a;第五维度 思路&#xff1a; 题目&#xff1a;公园 思路&#xff1a; 新材料 思路&#xff1a; 星际航行 思路…

网上蛋糕售卖店管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;店员管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&#xff0c;商品…

MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

文章目录 问题描述问题原因解决办法方法一&#xff1a;在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息方法二&#xff1a;重载OnOK函数方法三&#xff1a;将所有按钮类型设为普通按钮&#xff0c;并设置其中一个按钮为默认按钮 问题描述 一般情况下编写的MFC对话框程…

【如何在日志中输出精确到毫秒的时间戳】

1. 需求 在日志中输出精确到毫秒级的时间戳&#xff0c; 格式为&#xff1a;%Y-%m-%d %H:%M:%S.%MS 如&#xff1a;2024-05-30 22:33:25.821 2. 代码实现 #include <iostream> #include <chrono> #include <iomanip> #include <sstream> #include &…

锻压设备智能制造工厂物联数字孪生平台,推进制造业数字化转型

锻压设备智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。随着全球制造业的飞速发展&#xff0c;数字化转型已经成为企业提升竞争力、实现可持续发展的关键。在锻压设备智能制造领域&#xff0c;工业物联数字孪生平台以其强大的数据集成、分析和管理能力&#…

k均值过程图解

k均值聚类实际上是数据空间质心的Voronoi 划分问题。

C语言 | Leetcode C语言题解之第124题二叉树中的最大路径和

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int max; int dfs(struct TreeNode* root){if(!root) return 0;int left dfs(root->left…

中继器、集线器、网桥、交换机、路由器和网关

目录 前言一、中继器、集线器1.1 中继器1.2 集线器 二、网桥、交换机2.1 网桥2.2 交换机 三、路由器、网关3.1 路由器3.2 网关 总结 前言 理解这些设备的关键是他们运行在不同的层次上。之所以存在不同层的问题&#xff0c;是因为不同的设备使用不同的信息来决定如何交换。在典…

AI大模型的创新之道:突破局限与引领未来

1、引言 随着人工智能技术的飞速发展&#xff0c;AI大模型已成为推动科技进步的重要力量。它们不仅拥有强大的数据处理能力和学习能力&#xff0c;还能在多个领域展现出超越人类智慧的潜力。然而&#xff0c;AI大模型也面临着诸多挑战和局限&#xff0c;如数据依赖、计算资源消…

[数据集][目标检测]剪刀石头布检测数据集VOC+YOLO格式1973张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1973 标注数量(xml文件个数)&#xff1a;1973 标注数量(txt文件个数)&#xff1a;1973 标注…

【Qt】【模型视图架构】代理模型示例

文章目录 1. 基本排序/过滤模型Basic Sort/Filter Model Example2. 自定义排序/过滤模型Custom Sort/Filter Model ExampleFilterLineEdit类定义及实现MySortFilterProxyModel类定义及实现 1. 基本排序/过滤模型Basic Sort/Filter Model Example 官方提供的基本排序/过滤模型示…

YOLOv5改进 | 添加注意力篇 | 利用YOLOv10提出的PSA注意力机制助力YOLOv5有效涨点(附代码 + 详细修改教程)

一、本文介绍 本文给大家带来的改进机制是YOLOv10提出的PSA注意力机制&#xff0c;自注意力在各种视觉任务中得到了广泛应用&#xff0c;因为它具有显著的全局建模能力。然而&#xff0c;自注意力机制表现出较高的计算复杂度和内存占用。为了解决这个问题&#xff0c;鉴于注意…

本地公网IP是什么?

本地公网IP&#xff08;Public IP Address&#xff09;是指分配给计算机或设备的可在互联网上直接访问的唯一标识符。每个连接到互联网的设备都会被分配一个公网IP&#xff0c;用于与其他设备进行通信。本地公网IP在网络通信中起到了非常重要的作用&#xff0c;为用户提供了方便…

Docker 简介和安装

目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念&#xff1a;镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚…