gpt4 book ai didi

qt - (PyQt) QTreeView - 想要展开/折叠所有子项和孙项

转载 作者:行者123 更新时间:2023-12-02 05:27:09 27 4
gpt4 key购买 nike

我希望能够展开或折叠 QTreeView 中特定分支的所有子级。我正在使用 PyQt4。

我知道 QTreeView 有一个绑定(bind)到 * 的展开所有子项功能,但我需要两件事:它需要绑定(bind)到不同的组合键(shift-space),并且我还需要能够折叠所有子项 children 也是如此。

这是我迄今为止尝试过的:我有一个 QTreeView 的子类,其中我正在检查 Shift-Space 键组合。我知道 QModelIndex 会让我使用“child”函数选择一个特定的子项,但这需要知道子项的数量。我能够通过查看internalPointer来获取子级的计数,但这只能提供层次结构第一级的信息。如果我尝试使用递归,我可以获得一堆子计数,但随后我不知道如何将它们转换回有效的 QModelIndex。

这是一些代码:

def keyPressEvent(self, event):
"""
Capture key press events to handle:
- enable/disable
"""
#shift - space means toggle expanded/collapsed for all children
if (event.key() == QtCore.Qt.Key_Space and
event.modifiers() & QtCore.Qt.ShiftModifier):
expanded = self.isExpanded(self.selectedIndexes()[0])
for cellIndex in self.selectedIndexes():
if cellIndex.column() == 0: #only need to call it once per row
#I can get the actual object represented here
item = cellIndex.internalPointer()
#and I can get the number of children from that
numChildren = item.get_child_count()
#but now what? How do I convert this number into valid
#QModelIndex objects? I know I could use:
# cellIndex.child(row, 0)
#to get the immediate children's QModelIndex's, but how
#would I deal with grandchildren, great grandchildren, etc...
self.setExpanded(cellIndex, not(expanded))
return

这是我正在研究的递归方法的开始,但在实际尝试设置扩展状态时我陷入困境,因为一旦进入递归,我就失去了与任何有效 QModelIndex 的“联系”...

def toggle_expanded(self, item, expand):
"""
Toggles the children of item (recursively)
"""
for row in range(0,item.get_child_count()):
newItem = item.get_child_at_row(row)
self.toggle_expanded(newItem, expand)
#well... I'm stuck here because I'd like to toggle the expanded
#setting of the "current" item, but I don't know how to convert
#my pointer to the object represented in the tree view back into
#a valid QModelIndex
#self.setExpanded(?????, expand) #<- What I'd like to run
print "Setting", item.get_name(), "to", str(expand) #<- simple debug statement that indicates that the concept is valid

感谢大家花时间查看此内容!

最佳答案

好吧... sibling 实际上并没有让我到达我想去的地方。我设法让代码按如下方式工作(这似乎是一个不错的实现)。仍然要感谢 Ebral 教授,他让我沿着 sibling 的想法走上了正确的道路(事实证明我需要使用 QModelIndex.child(row, column) 并从那里递归迭代)。

请注意,代码中有以下假设:它假设您的基础数据存储对象能够报告它们有多少个子对象(在我的代码中为 get_child_count() )。如果不是这种情况,您将不得不以不同的方式获得子计数...也许只是任意尝试获取子索引 - 使用 QModelIndex.child(row, col) - 行数不断增加直到您返回无效索引? - 这是 Prof.Ebral 的建议,我可能仍然会尝试(只是我已经有了一种简单的方法来通过从我的数据存储请求来获取子计数)。

另请注意,我实际上根据是展开还是折叠在递归中的不同点展开/折叠每个节点。这是因为,通过反复试验,我发现如果我只在代码中的一处执行动画 TreeView ,动画 TreeView 就会卡顿和弹出。现在,通过根据我是否位于顶层(即我正在影响的分支的根 - 而不是整个 TreeView 的根)来反转我执行此操作的顺序,我得到了一个非常流畅的动画。下面记录了这一点。

以下代码位于 QTreeView 子类中。

#---------------------------------------------------------------------------
def keyPressEvent(self, event):

if (event.key() == QtCore.Qt.Key_Space and self.currentIndex().column() == 0):
shift = event.modifiers() & QtCore.Qt.ShiftModifier
if shift:
self.expand_all(self.currentIndex())
else:
expand = not(self.isExpanded(self.currentIndex()))
self.setExpanded(self.currentIndex(), expand)


#---------------------------------------------------------------------------
def expand_all(self, index):
"""
Expands/collapses all the children and grandchildren etc. of index.
"""
expand = not(self.isExpanded(index))
if not expand: #if collapsing, do that first (wonky animation otherwise)
self.setExpanded(index, expand)
childCount = index.internalPointer().get_child_count()
self.recursive_expand(index, childCount, expand)
if expand: #if expanding, do that last (wonky animation otherwise)
self.setExpanded(index, expand)


#---------------------------------------------------------------------------
def recursive_expand(self, index, childCount, expand):
"""
Recursively expands/collpases all the children of index.
"""
for childNo in range(0, childCount):
childIndex = index.child(childNo, 0)
if expand: #if expanding, do that first (wonky animation otherwise)
self.setExpanded(childIndex, expand)
subChildCount = childIndex.internalPointer().get_child_count()
if subChildCount > 0:
self.recursive_expand(childIndex, subChildCount, expand)
if not expand: #if collapsing, do it last (wonky animation otherwise)
self.setExpanded(childIndex, expand)

关于qt - (PyQt) QTreeView - 想要展开/折叠所有子项和孙项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4100139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com