qt qtreewidgetitem_qtwidgets

qt qtreewidgetitem_qtwidgetsQTreeWidget在添加了数据之后点击扩展箭头展开和收缩的时候会显得卡顿,这个是qt内核的一个bug,正常情况下应该是立即响应的,既然是qt的bug,就只能换种方式实现TreeWidget来解决这个bug,具体办法大致可以有一下几种,具体看需求来决定用哪一种方法更好:如果需求要求实现的TreeWidget不要求是完全的TreeWidget,扩展的层次是有限制的,就是只有2层,3层或者…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

 

QTreeWidget在添加了数据之后点击扩展箭头展开和收缩的时候会显得卡顿,这个是qt内核的一个bug,正常情况下应该是立即响应的,既然是qt的bug,就只能换种方式实现TreeWidget来解决这个bug,具体办法大致可以有一下几种,具体看需求来决定用哪一种方法更好:

  1. 如果需求要求实现的TreeWidget不要求是完全的TreeWidget,扩展的层次是有限制的,就是只有2层,3层或者4层,需求要求的TreeWidget节点层次比较少有限制,可以使用QListView这样的空间代替QTreeWidget,只要控制好他们层次的扩展关系,自定义响应的类型是父类型还是子类型等,来控制改显示的item是应该缩进的大小。如果是子节点就绘制缩进大一点,如果是父节点就让缩进的小一点,这样就能用类似QListView做出类似QTreeWidget的效果了

2.还有一种办法就是还是使用类似QTreeWidget组件,关于这个操作扩展和收缩会卡顿的bug可以隐藏起来,换一种办法实现。如何隐藏起来呢,QTreeWidget有一个属性

indentation : int

indentation of the items in the tree view.

This property holds the indentation measured in pixels of the items for each level in the tree view. For top-level items, the indentation specifies the horizontal distance from the viewport edge to the items in the first column; for child items, it specifies their indentation from their parent items.

By default, the value of this property is style dependent. Thus, when the style changes, this property updates from it. Calling setIndentation() stops the updates, calling resetIndentation() will restore default behavior.

这个属性是专门用于处理QTreeWidget的item缩进的,item层次越多,缩进的值就越多,如果将该属性的值设置为0,就不会缩进了,这样可以达到的效果就是可以将扩展和收缩的箭头隐藏起来,qt内核处理是将该箭头放到indentation设置的大小区域的,如果设置为0,就没有地方放它了,它就会看不见了,达到了隐藏起来的效果,这样就把QTreeWidget这个bug隐藏起来了,就相当于解决了QTreeWidget的这个bug,既然隐藏了这个扩展和收缩的按钮,那么怎么实现扩展和收缩的功能呢,可以绑定对应的点击信号和槽函数就可以了。

    connect(ui->treeWidget, &QTreeWidget::itemClicked, [=](QTreeWidgetItem* item,int nidex){

        bool bIsChild = item->data(0, Qt::UserRole).toBool();

        if (!bIsChild)

        {

            item->setExpanded(!item->isExpanded());

        }

    });

类似这样的代码就可以达到收缩和隐藏的功能了,既然功能达到了,剩下的就是处理好这个收缩和隐藏的按钮显示就可以了,通过自定义item,通过设置如果该item有子节点的话,就画上去就可以了。

做到了这一步就可以达到基本上大多数treeWidget的效果了,而且通过这种办法解决了QTreeWidget的这个bug,实现的效果大致就是这样,还差一点就是缩进了,就是点击收缩和隐藏按钮可以达到数据的效果,只是没有缩进值了,因为已经设置为0了,所以不会缩进,通过自定义缩进值,绘制出缩进效果就可以了,如何绘制出来呢,缩进值得大小取决于item的层次大小,首先需要获取自定义item层次,关键代码如下:

QTreeWidgetItem *MainWindow::addChildNode(QTreeWidgetItem *parent, int index)
{
  
  
    QTreeWidgetItem *pDeptItem = new QTreeWidgetItem();
    //设置Data用于区分,Item是分组节点还是子节点,0代表分组节点,1代表子节点
    pDeptItem->setData(0, Qt::UserRole, 1);
    pDeptItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    pDeptItem->setCheckState(1, Qt::Unchecked);
    int level = 0;
    DepartNodeItem *departNode = dynamic_cast<DepartNodeItem*>(ui->tree->itemWidget(parent, 0));
    if (departNode) {
  
  
        level = departNode->getLevel();
        level ++;

}

}

void NodeItem::setLevel(int level)
{
  
  
    this->m_level = level;
    this->m_indentation = this->m_level * INDENTATION;
    this->m_headLabelWidth = this->m_indentation + HEAD_LABEL_WIDTH;
    ui->lbHeadPic->setMinimumWidth(m_indentation);

}

通过自定义添加节点的接口自定义level实现,这样itemwidget就能通过自定义实现获取当前level层次,然后计算出缩进值m_indentation

然后根据这个缩进值绘制出来就可以达到缩进的效果了。

这样就实现了QTreeWidget的功能同时相当于解决了QTreeWidget这个关于卡顿的bug.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187252.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 通配符掩码

    通配符掩码在访问控制列表中,通配符掩码来指定主机、特定网络或网络的一部分,首先要理解块大小,其用于指定地址范围块大小包括128、64、32、16、8、4等,在需要指定地址范围时,可使用能满足需求的最小块大小,

  • Java基础

    Java基础

  • Ajaxpro组件

    Ajaxpro组件这一篇我们来看一个开源的组件:ajaxpro。虽然这是一个比较老的组件,不过实现思想和源码还是值得我们学习的。通过上一篇的介绍,我们知道要调用页面对象的方法,就是靠反射来实现的,关键是整个处理过程,包括反射调用方法、参数映射等。ajaxpro不仅在后台帮我们实现了这个过程,在前台也封装了请求调用的方法,例如ajax的相关方法,用ajaxpro的方法就可以发送异步请求了,不需要自己封装js或者使用j…

  • 狂神说Vue笔记整理「建议收藏」

    狂神说Vue笔记整理「建议收藏」狂神说Vue笔记​ 想要成为真正的“互联网Java全栈工程师”还有很长的一段路要走,其中前端是绕不开的一门必修课。本阶段课程的主要目的就是带领Java后台程序员认识前端、了解前端、掌握前端,为实现成为“互联网Java全栈工程师”再向前迈进一步。一、前端核心分析1.1、概述Soc原则:关注点分离原则Vue的核心库只关注视图层,方便与第三方库或既有项目整合。HTML+CSS+JS:视图:给用户看,刷新后台给的数据网络通信:axios页面跳转:vue-router状态管

  • 企业linux应用ssh免密码登陆上机实战考试题

    企业linux应用ssh免密码登陆上机实战考试题

  • Jps命令—使用详解[通俗易懂]

    Jps命令—使用详解[通俗易懂]原文:https://blog.csdn.net/wisgood/article/details/38942449 jps是jdk提供的一个查看当前java进程的小工具,可以看做是JavaVirtualMachineProcessStatusTool的缩写。非常简单实用。    命令格式:jps[options][hostid]     [options…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号