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)


相关推荐

  • 了解DeepFakes背后的技术

    了解DeepFakes背后的技术1.神经网络和自动编码器简介神经网络概论在计算机科学中,人工神经网络由成千上万个以特定方式连接的节点组成。节点通常分层排列;它们的连接方式决定了网络的类型,最终决定了网络在另一网络上执行特定计算任务的能力。传统的神经网络可能看起来像这样:输入层中的每个节点(或人工神经元)都包含一个数值,该数值对我们要馈送到网络的输入进行编码。如果我们要预测明天的天气,则输入节点可能包含以范围内的数字编码的压力,温度,湿度和风速\left[-1,+1\right]。这些值被广播到下一层。有趣的是,每个边缘

  • 什么是前端框架与后端框架

    什么是前端框架与后端框架什么是框架框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。

  • ORACLE新增主键问题【CREATE PRIMARY KEY AFTER CREATED A TABLE】

    ORACLE新增主键问题【CREATE PRIMARY KEY AFTER CREATED A TABLE】

  • Python基础之(三)—-PyGame安装步骤

    Python基础之(三)—-PyGame安装步骤

    2021年10月16日
  • vs2010注册密钥_vs2012ultimate密钥

    vs2010注册密钥_vs2012ultimate密钥MicrosoftVisualStudioUltimate2012旗舰版有效注册密钥:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC

    2022年10月14日
  • windows MySQL数据库备份bat脚本[通俗易懂]

    windows MySQL数据库备份bat脚本[通俗易懂]在windows服务器上,想要定时备份数据库数据,可采用windows的任务计划程序+数据库备份脚本组合。其中,MySQL数据库备份,起到关键作用是mysqldump。有关于mysqldump命令的用法,可以找MySQL的官方文档了解。以下主要描述脚本:echo设置MySql数据库的连接信息sethost=127.0.0.1setusername=rootsetpassword…

发表回复

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

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