2017-10-15 120 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