2017-10-15 121 views
1

我有两个QTreeWidget的形式,一个没有孩子,另一个孩子如下面的截图所示。我希望如果合适的树被折叠(如果它被展开,则折叠),每次选择左树中的项目时都会展开。蟒蛇 - 同步两个QTreeWidgets

enter image description here

我试着用下面的代码,在那里我一个手柄功能连接到左侧列表中的itemSelectionChanged事件来实现这一目标。问题是.collapse()和.expand()方法需要一个QIndexModel参数(继承自QTreeView),但QTreeWidget使用了一个我不知道如何访问的预定义​​模型。

任何人都可以在那里给我手?

import sys 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.tree1 = QtGui.QTreeWidget(self) 
     self.tree2 = QtGui.QTreeWidget(self) 
     layout = QtGui.QHBoxLayout(self) 

     self.tree1.header().hide() 
     self.tree2.header().hide() 
     self.tree1.itemSelectionChanged.connect(self.handleSelected) 
     for text in 'A B C D'.split(): 
      item = QtGui.QTreeWidgetItem(self.tree1, [text]) 
     for text in '1 2 3 4'.split(): 
      item = QtGui.QTreeWidgetItem(self.tree2, [text]) 
      for text in 'red blue green'.split(): 
       child = QtGui.QTreeWidgetItem(item, [text]) 
     layout.addWidget(self.tree1) 
     layout.addWidget(self.tree2) 

    def handleSelected(self): 
     if self.tree2.isExpanded(): 
      self.tree2.collapse() 
     else: 
      self.tree2.expand() 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

回答

1

的树控件项目有setExpanded方法和isSelected方法,因此,所有你需要做的是遍历顶级项目和切换每个之一:

def handleSelected(self): 
    for index in range(self.tree1.topLevelItemCount()): 
     item1 = self.tree1.topLevelItem(index) 
     item2 = self.tree2.topLevelItem(index) 
     item2.setExpanded(item1.isSelected()) 
+0

谢谢@ ekhumoro,它现在很好用!干杯。 – maurobio