2017-02-02 1 views
0

저는 QTreeview를 보유하고 있으며 사용자 선택에 따라 선택한 항목의 부모 이름을 모두 포함하는 고유 한 배열을 얻고 싶습니다.QTreeview 선택 상위 항목을 반환하십시오.

자식이 선택되면 부모를 반환하고 부모가 선택되면 부모를 반환합니다.

는 반환 것 :

>> [Kevin, Michelle, Nikki, Tim] 

enter image description here 여기

from PySide import QtGui, QtCore 
from PySide import QtSvg, QtXml 
import sys 

class Person: 
    def __init__(self, name="", children=None): 
     self.name = name 
     self.children = children if children else [] 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.resize(300, 400) 
     self.init_ui() 

    def init_ui(self): 
     # Setup Tabs Widget 
     # self.treeview = QtGui.QTreeView() 
     self.treeview = QtGui.QTreeView() 
     self.treeview.setHeaderHidden(True) 
     self.treeview.setUniformRowHeights(True) 
     self.treeview.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     self.treeview.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 

     self.model = QtGui.QStandardItemModel() 
     self.treeview.setModel(self.model) 

     self.action = QtGui.QAction('Print', self) 
     self.action.setShortcut('F5') 
     self.action.triggered.connect(self.get_checked) 

     fileMenu = QtGui.QMenu("&File", self) 
     fileMenu.addAction(self.action) 
     self.menuBar().addMenu(fileMenu) 

     # Setup central widget 
     self.setCentralWidget(self.treeview) 

     # populate data 
     self.populate_people() 
     self.treeview.expandAll() 

    def populate_people(self): 
     parents = [ 
      Person("Kevin", [Person("Tom"), Person("Sarah"), Person("Chester")]), 
      Person("Michelle", [Person("James"), Person("Corey"),Person("Leslie")]), 
      Person("Doug", [Person("Fred"), Person("Harold"),Person("Stephen")]), 
      Person("Nikki", [Person("Brody"), Person("Tyson"),Person("Bella")]), 
      Person("Tim", [Person("Marie"), Person("Val"),Person("Ted")]) 
     ] 

     for p in parents: 
      self.create_nodes(p, self.model) 

    def create_nodes(self, node, parent): 
     tnode = QtGui.QStandardItem() 
     tnode.setCheckable(True) 
     tnode.setData(QtCore.Qt.Unchecked, role=QtCore.Qt.CheckStateRole) 
     tnode.setData(node.name , role=QtCore.Qt.DisplayRole) 
     tnode.setData(node, role=QtCore.Qt.UserRole) # store object on item 

     parent.appendRow(tnode) 

     for x in node.children: 
      self.create_nodes(x, tnode) 

    def get_checked(self): 
     print "collecting parents..." 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = MainWindow() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

답변

2

간단한 구현 : 순서대로 인덱스가 선택되었다

def selectedParents(self): 
    parents = set() 
    for index in self.treeview.selectedIndexes(): 
     while index.parent().isValid(): 
      index = index.parent() 
     parents.add(index.sibling(index.row(), 0)) 
    return [index.data() for index in sorted(parents)] 

참고 반환 selectedIndexes() 것을, 그리고, 여러 개의 열이있는 경우 선택된 행의 모든 ​​열의 인덱스

따라서 위의 방법은 첫 번째 열의 텍스트 만 포함되도록하고 항목이 올바른 순서로 반환되도록합니다.

관련 문제