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.

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是国际邮箱地址,如何登录域名邮箱?「建议收藏」

    什么是国际邮箱地址,如何登录域名邮箱?「建议收藏」互联网的高速发展,信息通讯的重要,邮箱已然变成不可或缺的通讯工具,TOM企业邮箱作为国内重要的邮箱厂商,一直为广大用户提供系统的邮箱服务。国际邮箱地址与国内都是同等格式,账号名称@域名组成通用的国际邮箱地址,下面给大家讲解如何注册域名邮箱并登录使用。如何注册域名邮箱?首先讲下域名邮箱的特点,域名邮箱是指用公司或者个人注册的域名,用来开通邮箱时使用的域名,其具有个性化、标志化的特点,在商务往来中更加突显正规性。注册完成将域名解析到邮箱服务商,开通的邮箱就能使用了。登录使用域名邮箱邮箱开通后,使用邮箱

    2022年9月24日
    3
  • activex控件被阻止怎么办_javascript console

    activex控件被阻止怎么办_javascript consoleActiveXObject对象启用和返回对自动化对象的引用。此对象仅用于实例化自动化对象,且此对象没有成员。警告:此对象为Microsoft扩展,仅在InternetExplorer中受支持,在Windows8.x应用商店应用中不受支持。语法:newObj=newActiveXObject(servername.typename[,location])参数:newObj:…

    2022年10月14日
    3
  • 7. QFile读写文件的基本操作「建议收藏」

    7. QFile读写文件的基本操作「建议收藏」QFile的基本读写操作

    2022年5月4日
    459
  • leetcode 回文数_字符串转换为整数

    leetcode 回文数_字符串转换为整数原题链接请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,“1

    2022年8月9日
    5
  • ios系统数据迁移至安卓系统_系统迁移关闭所有运行软件

    ios系统数据迁移至安卓系统_系统迁移关闭所有运行软件2018-11-16回答从安卓设备转移到ios的应用叫movetoios2015年9月17日,除ios9外,苹果当地时间周三还发布了movetoios——帮助用户将应用由android迁移到ios的一款工具,这也是苹果开发的首款android应用。movetoios的设计目标是使用户能方便地把数据由android设备迁移到新款iphone或ipad。用户能迁移的数据包括电话簿、日程…

    2022年9月15日
    1
  • hystrix实现服务降级的3种方式[通俗易懂]

    hystrix实现服务降级的3种方式[通俗易懂]1、hystrix是什么Hystrix是一款开源的容错插件,具有依赖隔离,系统容错降级等功能,这也是其最重要的两种用途,还有请求合并等功能2、为什么要进行隔离在实际工作中,尤其是分布式、微服务越来越普遍的今天,一个服务经常需要调用其他的服务,即RPC调用,而调用最多的方式还是通过http请求进行调用,这里面就有一个问题了,如果调用过程中,因为网络等原因,造成某个服务调用超时,如果没有熔断机制…

    2022年4月30日
    123

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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