2017-01-31 7 views
1

Qtreeviewのすべてのアイテムを収集する方法を教えてもらうために、それらを繰り返して、テキストの更新や色の変更などの必要な変更を適用できますか?QTreeviewのすべてのアイテムを再帰的に収集します

'match'メソッドを使用してすべてを簡単に収集する方法はありますか?

def get_checked(self): 
    model = self.treeview.model() 
    checked = model.match(
     model.index(0, 0), QtCore.Qt.CheckStateRole, 
     QtCore.Qt.Checked, -1, 
     QtCore.Qt.MatchExactly | QtCore.Qt.MatchRecursive) 
    for index in checked: 
     item = model.itemFromIndex(index) 
     print(item.text()) 

テストコード:ここ

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.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): 
     parent = Person("Kevin", [ 
       Person("Tom", [Person("Sally"), Person("Susan")]), 
       Person("Snappy", [Person("John"), Person("Kimmy"), 
            Person("Joe")]), 
       Person("Chester", [Person("Danny"), Person("Colleen")]) 
      ] 
     ) 
     self.create_nodes(parent, 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..." 


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

if __name__ == '__main__': 
    main() 

答えて

1

再帰溶液である(パイソンを必要> = 3.3):(Python2 /のpython3用)

def iterItems(self, root): 
    def recurse(parent): 
     for row in range(parent.rowCount()): 
      for column in range(parent.columnCount()): 
       child = parent.child(row, column) 
       yield child 
       if child.hasChildren(): 
        yield from recurse(child) 
    if root is not None: 
     yield from recurse(root) 

代替再帰溶液:

def iterItems(self, root): 
    def recurse(parent): 
     if root is not None: 
      for row in range(parent.rowCount()): 
       for column in range(parent.columnCount()): 
        child = parent.child(row, column) 
        yield child 
        if child.hasChildren(): 
         for item in recurse(child): 
          yield item 
    return recurse(root) 

ここでは反復解があります(Python2 /のpython3のために):

def iterItems(self, root): 
    if root is not None: 
     stack = [root] 
     while stack: 
      parent = stack.pop(0) 
      for row in range(parent.rowCount()): 
       for column in range(parent.columnCount()): 
        child = parent.child(row, column) 
        yield child 
        if child.hasChildren(): 
         stack.append(child) 

(NB:このソリューションは、より予測可能な順序付けを与え、少し速くです)

使用法:

root = self.treeview.model().invisibleRootItem() 
for item in self.iterItems(root): 
    print(item.text()) 

root引数は任意のものとすることができますQStandardItemModelの項目です。

+0

あなたのソリューションを維持しながら、Python 2.7についてはどうですか? @JokerMartini。 – JokerMartini

+0

私は他のいくつかのソリューションを追加しました。 – ekhumoro

関連する問題