Advertisement
Guest User

QTreeView with QAbstractItemModel - insert rows causes crash

a guest
Jan 13th, 2012
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1.  
  2. from PyQt4.QtCore import *
  3. from PyQt4.QtGui import *
  4. from lsfw2.lsgui.tree import TreeModel, TreeItem
  5.  
  6. class MyTreeItem(TreeItem):
  7.  
  8.     def __init__(self, data, parent=None):
  9.         TreeItem.__init__(self, data, parent)
  10.         if parent is not None:
  11.             parent.appendChild(self)
  12.            
  13.  
  14. class MyProxyModel(QSortFilterProxyModel):
  15.    
  16.     def __init__(self, *args, **kwargs):
  17.         super(MyProxyModel, self).__init__(*args, **kwargs)
  18.         self._filter_wildcard = ''
  19.        
  20.     def filterAcceptsRow(self, source_row, source_parent):
  21.         index = self.sourceModel().index(source_row, 0, source_parent)
  22.         item = self.sourceModel().get_item(index)
  23.         if item is None:
  24.             return False
  25.         return self.is_visible(item)
  26.    
  27.     def is_visible(self, item):
  28.         items = [item]
  29.         items.extend(item.childItems)
  30.         for i in items:
  31.             if self._filter_wildcard in unicode(i.data(0)).lower():
  32.                 return True
  33.         return False
  34.    
  35.     def setFilterWildcard(self, filter_wildcard):
  36.         self._filter_wildcard = filter_wildcard
  37.         return super(MyProxyModel, self).setFilterWildcard(
  38.             unicode(filter_wildcard))
  39.    
  40.  
  41. class MyModel(TreeModel):
  42.    
  43.     def __init__(self, root, parent=None):
  44.         QAbstractItemModel.__init__(self, parent)
  45.         self.rootItem = root
  46.        
  47.     def insert_row(self, data, append=True):
  48.         parent = data.parentItem
  49.         parent_index = self.get_model_index(parent)
  50.         row_index = len(parent.childItems)
  51.         self.beginInsertRows(parent_index, row_index, 1)
  52.         if append:
  53.             parent.appendChild(data)
  54.         self.endInsertRows()
  55.         return True
  56.        
  57.     def get_model_index(self, data):
  58.         indexes = []
  59.         while data.parentItem is not None:
  60.             indexes.append(data.parentItem.childItems.index(data))
  61.             data = data.parentItem
  62.         model_index = self.createIndex(0, 0, self.rootItem)
  63.         for i in reversed(indexes):
  64.             model_index = self.index(i, 0, model_index)
  65.         return model_index
  66.  
  67.     def data(self, index, role=Qt.DisplayRole):
  68.         if not index.isValid():
  69.             return None
  70.         item = index.internalPointer()  
  71.         if role == Qt.DisplayRole:
  72.             return item.data(index.column())
  73.        
  74.    
  75. class MyWidget(QWidget):
  76.    
  77.     phonetic_alphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot',
  78.         'Golf', 'Hotel', 'India', 'Juliet', 'Kilo', 'Lima', 'Mike', 'November',
  79.         'Oscar', 'Papa', 'Quebec', 'Romeo', 'Sierra', 'Tango', 'Uniform', 'Victor',
  80.         'Whiskey', 'X-Ray', 'Yankee', 'Zulu']
  81.    
  82.  
  83.     def start_structure(self):
  84.         self.root = MyTreeItem(['Root'])
  85.         self.alphabet = MyTreeItem(['Alphabet'], parent=self.root)
  86.        
  87.         alpha = self.available.pop(0)
  88.         bravo = self.available.pop(0)
  89.         charlie = self.available.pop(0)
  90.         MyTreeItem([alpha], parent=self.alphabet)
  91.         MyTreeItem([bravo], parent=self.alphabet)
  92.         MyTreeItem([charlie], parent=self.alphabet)
  93.    
  94.    
  95.     def __init__(self):
  96.         QWidget.__init__(self)
  97.         self.available = self.phonetic_alphabet[:]
  98.         layout = QVBoxLayout()
  99.         self.ed_filter = QLineEdit()
  100.         self.ed_filter.textChanged.connect(self.on_ed_filter_changed)
  101.         layout.addWidget(self.ed_filter)
  102.         self.tree = QTreeView()
  103.         layout.addWidget(self.tree)
  104.         self.btn = QPushButton('Go')
  105.         self.btn.clicked.connect(self.on_btn_clicked)
  106.         layout.addWidget(self.btn)
  107.         self.btn_reset = QPushButton('Reset')
  108.         self.btn_reset.clicked.connect(self.on_btn_reset_clicked)
  109.         layout.addWidget(self.btn_reset)
  110.         self.setLayout(layout)
  111.         self.start_structure()
  112.        
  113.         model = MyModel(self.root)
  114.  
  115.         # This doesnt work
  116.         proxymodel = MyProxyModel()
  117.         proxymodel.setSourceModel(model)
  118.         self.tree.setModel(proxymodel)
  119.        
  120.         # This works
  121. #        self.tree.setModel(model)
  122.        
  123.        
  124.     def on_ed_filter_changed(self, text):
  125.         text = unicode(text).lower()
  126.         self.tree.model().setFilterWildcard(text)
  127.        
  128.    
  129.     def on_btn_clicked(self):
  130.         x = self.available.pop(0)
  131.         data = TreeItem([x], parent=self.alphabet)
  132.         self.tree.model().sourceModel().insert_row(data) # This doesnt work
  133. #        self.tree.model().insert_row(data) # This works
  134.         print 'clicked'
  135.        
  136.        
  137.     def on_btn_reset_clicked(self):
  138.         self.tree.model().reset()
  139.        
  140.        
  141. if __name__ == '__main__':
  142.     app = QApplication([])
  143.     widget = MyWidget()
  144.     widget.show()
  145.    
  146.     app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement