QtreeWidget的相关问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QtreeWidget的相关问题相关的知识,希望对你有一定的参考价值。

在QTreeWidgetItem上加入一个QComboBox后,为什么点击QCOmboBox时,该行的宽度会变大,怎么设置点击QComboBox时,宽度还是原来的宽度

参考技术A 那是因为点击QComboBox后QTreeWidget根据QComboBox的行高对QTreeWidget的行高做的修正。
void QTreeWidgetItem::setSizeHint ( int column, const QSize & size )
Sets the size hint for the tree item in the given column to be size. If no size hint is set, the item delegate will compute the size hint based on the item data.
This function was introduced in Qt 4.1.
(当没有设置Item大小的时候,Delegate 会根据item里的数据来调整item的大小)
做为一只程序猿你应该可以很轻松的略读这段帮助文档吧。

你可以使用setSizeHint对QTreeWidget的行高进行修改。
但是当要添加的窗口的最小大小超过了你设置的QSize以后。QTreeWidget就会使用所填加的窗口的大小。忽视我们设置的大小。本回答被提问者采纳

PyQt5如何实现对QTreeWidget下所有Item的遍历

前言:作为一只菜鸟,无法像诸位大神那样在描述问题之前深入浅出地介绍背景TAT,只能默认来看这篇文章的人对QTreeWidget已经有过了解,想在python中实现对其下所有Item的遍历。


 

  由于试手的软件里需要实现按下相关功能键后,删除QTreeWidget中打勾(即checked)的item。所以需要遍历所有item检查状态。在阅读QT文档的时候(因为PyQt5的Reference Guide还没更新......所以只好点它给的C++ Documentation的链接),发现QT其实有提供一个迭代器——QTreeWidgetItemIterator,在其官方文档里,它是这么实现功能的:

1     QTreeWidgetItemIterator it(treeWidget);
2     while (*it) {
3         if ((*it)->text(0) == itemText)
4             (*it)->setSelected(true);
5         ++it;
6     }

  ......

  对于一个菜鸟,要根据这个一眼看出Python里要怎么改实在太有难度了啊!——所以我就先去必应了下有没有其他方法。发现大家在PyQt下大多是用这个方法:

1、先用QTreeWidgettopLevelItemCount()获得topLevelItem的数量

2、然后用for循环和topLevelItem(int index)获得顶层的结点

3、再用QTreeWidgetItem里的功能获得顶层结点下的children结点

  由于一直被教导要追求简洁,以及看着QT明明有现成的功能却不能用,所以在英文搜索也没找到满意答案后(用的还是必应,google用不了),我又重新回来琢磨QTreeWidgetItemIterator,在花了许多时间仍无进展的情况下,只要先直接用代码试验,失败了N次之后,被一个无关的搜索结果提醒可以在Python交互行里用help看它有没有在这提供文档说明,一试之下,果然有:

class QTreeWidgetItemIterator(sip.simplewrapper)
 |  QTreeWidgetItemIterator(QTreeWidgetItemIterator)
 |  QTreeWidgetItemIterator(QTreeWidget, QTreeWidgetItemIterator.IteratorFlags flags=QTreeWidgetItemIterator.All)
 |  QTreeWidgetItemIterator(QTreeWidgetItem, QTreeWidgetItemIterator.IteratorFlags flags=QTreeWidgetItemIterator.All)
 |  
 |  Method resolution order:
 |      QTreeWidgetItemIterator
 |      sip.simplewrapper
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  __iadd__(self, value, /)
 |      Return self+=value.
 |  
 |  __isub__(self, value, /)
 |      Return self-=value.

(文档未完,这里只放本问题需要的那一小部分)

  一下子看到了问题解决的曙光!!但是,作为一只菜鸟,我虽然看到了Methods,但没有立刻把它和C++里的指针联系起来,仍然在纠结PyQt下的QTreeWidgetItemIterator返回的应该是啥(用isinstance判断它既不是迭代器,也不是可迭代的)......

  所以再撞了几次墙后,我才突然反应了过来,最终实现代码如下:

def delSelected(self):
    item = QtWidgets.QTreeWidgetItemIterator(self.treeWidget)
#该类的value()即为QTreeWidgetItem
    while item.value():if item.value().checkState(0) == QtCore.Qt.Checked:
#参考网上的方法,判断有无父母结点后再分别操作的那个,实在找不到更直接的
            self.deleteNode()
#因为我这里是删除了结点,删除后结点位置发生变化,所以要向后退一步
            item = item.__isub__(1)
#到下一个节点
        item = item.__iadd__(1)

  非常简单有没有!官方提供这个功能就是有用有没有!!对于我这种不用考虑遍历效率的菜鸟太好用的有没有!!

  问题解决了,本文也到此结束,纪念我那抓狂的一个下午。感谢您读到了这里!如有错误请指正!

  

以上是关于QtreeWidget的相关问题的主要内容,如果未能解决你的问题,请参考以下文章

QTreeWidget 仅在顶层拖放

如何将qtreewidget的currentindex向上移动一位

PyQt5如何实现对QTreeWidget下所有Item的遍历

设置 QtreeWidget 高度

向 QTreeWidget 添加一行

增加 qtreewidget 的大小