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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器学习-常用回归算法归纳(全网之最)

    机器学习-常用回归算法归纳(全网之最)文章目录前言一元线性回归多元线性回归局部加权线性回归多项式回归Lasso回归&Ridge回归Lasso回归Ridge回归岭回归和lasso回归的区别L1正则&L2正则弹性网络回归贝叶斯岭回归Huber回归KNNSVMSVM最大间隔支持向量&支持向量平面寻找最大间隔SVRCART树随机森林GBDTboosting思想AdaBoost思想提升树&梯度提升GBDT面试题整理XGBOOST面试题整理LightGBMXGBoost的缺点LightGBM的优化基于Hist

    2022年8月21日
    6
  • Leetcode 差分数组的应用「建议收藏」

    Leetcode 差分数组的应用「建议收藏」题目1解法这个题目普通解法参见这里不过这里面的做法都是nlog(n)的。实际上利用差分数组,这道题目可以有O(n)做法这边简单提一下差分序列,对于一个数组,差分序列的定义是数组中前一个值和后一个值的差值形成的新数组。我们在原数组某个区间加上一个统一的值,正常的做法需要在原数组每个位置去叠加,而体现在差分数组上只需要对区间两端的值进行变化即可,差分数组的prefixsum其实就是原数组。比如原数组为:num=[1,1,1,2,2,3]差分数组为:diff_num=[1,0,0,1,0,

    2022年6月3日
    32
  • 操作系统期末总复习(题库)[通俗易懂]

    操作系统期末总复习(题库)[通俗易懂]问答题什么是操作系统,主要功能有哪些?操作系统:计算机最基本最重要的基础性系统软件,可以使计算机系统能协调、高效和可靠地进行工作主要功能:处理器管理、存储器管理、设备管理、文件管理、作业管理等功能模块什么是微内核技术,主要有哪些功能?微内核技术把操作系统中更多的成分和功能放到更高的层次(即用户模式)中去运行,而留下一个尽量小的内核,用它来完成操作系统最基本的核心功能,称这种技术为微内核技术。主要功能:进程(线程)管理、低级存储器管理、中断和陷入处理等功能。简述进程的基本状态及状态之间的转换

    2022年6月1日
    220
  • 不止一个背包的背包问题_背包问题 java

    不止一个背包的背包问题_背包问题 java有 N 个物品和一个容量是 V 的背包。物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。如下图所示:如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品个数和背包容量。接下来有 N

    2022年8月9日
    0
  • Vue 绑定使用 touchstart touchmove touchend[通俗易懂]

    Vue 绑定使用 touchstart touchmove touchend[通俗易懂]Vue简单绑定touchstarttouchmovetouchend

    2022年6月19日
    93
  • 搭建邮件服务器,过程非常简单「建议收藏」

    搭建邮件服务器,过程非常简单,只需几个步骤即可。通常在Linux搭建邮件服务器是需要安装很多软件和配置文件的,所以我们可以使用一个开源邮件服务器软件来搭建的。

    2022年4月10日
    113

发表回复

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

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