Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from lsfw2.lsgui.tree import TreeModel, TreeItem
- class MyTreeItem(TreeItem):
- def __init__(self, data, parent=None):
- TreeItem.__init__(self, data, parent)
- if parent is not None:
- parent.appendChild(self)
- class MyProxyModel(QSortFilterProxyModel):
- def __init__(self, *args, **kwargs):
- super(MyProxyModel, self).__init__(*args, **kwargs)
- self._filter_wildcard = ''
- def filterAcceptsRow(self, source_row, source_parent):
- index = self.sourceModel().index(source_row, 0, source_parent)
- item = self.sourceModel().get_item(index)
- if item is None:
- return False
- return self.is_visible(item)
- def is_visible(self, item):
- items = [item]
- items.extend(item.childItems)
- for i in items:
- if self._filter_wildcard in unicode(i.data(0)).lower():
- return True
- return False
- def setFilterWildcard(self, filter_wildcard):
- self._filter_wildcard = filter_wildcard
- return super(MyProxyModel, self).setFilterWildcard(
- unicode(filter_wildcard))
- class MyModel(TreeModel):
- def __init__(self, root, parent=None):
- QAbstractItemModel.__init__(self, parent)
- self.rootItem = root
- def insert_row(self, data, append=True):
- parent = data.parentItem
- parent_index = self.get_model_index(parent)
- row_index = len(parent.childItems)
- self.beginInsertRows(parent_index, row_index, 1)
- if append:
- parent.appendChild(data)
- self.endInsertRows()
- return True
- def get_model_index(self, data):
- indexes = []
- while data.parentItem is not None:
- indexes.append(data.parentItem.childItems.index(data))
- data = data.parentItem
- model_index = self.createIndex(0, 0, self.rootItem)
- for i in reversed(indexes):
- model_index = self.index(i, 0, model_index)
- return model_index
- def data(self, index, role=Qt.DisplayRole):
- if not index.isValid():
- return None
- item = index.internalPointer()
- if role == Qt.DisplayRole:
- return item.data(index.column())
- class MyWidget(QWidget):
- phonetic_alphabet = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot',
- 'Golf', 'Hotel', 'India', 'Juliet', 'Kilo', 'Lima', 'Mike', 'November',
- 'Oscar', 'Papa', 'Quebec', 'Romeo', 'Sierra', 'Tango', 'Uniform', 'Victor',
- 'Whiskey', 'X-Ray', 'Yankee', 'Zulu']
- def start_structure(self):
- self.root = MyTreeItem(['Root'])
- self.alphabet = MyTreeItem(['Alphabet'], parent=self.root)
- alpha = self.available.pop(0)
- bravo = self.available.pop(0)
- charlie = self.available.pop(0)
- MyTreeItem([alpha], parent=self.alphabet)
- MyTreeItem([bravo], parent=self.alphabet)
- MyTreeItem([charlie], parent=self.alphabet)
- def __init__(self):
- QWidget.__init__(self)
- self.available = self.phonetic_alphabet[:]
- layout = QVBoxLayout()
- self.ed_filter = QLineEdit()
- self.ed_filter.textChanged.connect(self.on_ed_filter_changed)
- layout.addWidget(self.ed_filter)
- self.tree = QTreeView()
- layout.addWidget(self.tree)
- self.btn = QPushButton('Go')
- self.btn.clicked.connect(self.on_btn_clicked)
- layout.addWidget(self.btn)
- self.btn_reset = QPushButton('Reset')
- self.btn_reset.clicked.connect(self.on_btn_reset_clicked)
- layout.addWidget(self.btn_reset)
- self.setLayout(layout)
- self.start_structure()
- model = MyModel(self.root)
- # This doesnt work
- proxymodel = MyProxyModel()
- proxymodel.setSourceModel(model)
- self.tree.setModel(proxymodel)
- # This works
- # self.tree.setModel(model)
- def on_ed_filter_changed(self, text):
- text = unicode(text).lower()
- self.tree.model().setFilterWildcard(text)
- def on_btn_clicked(self):
- x = self.available.pop(0)
- data = TreeItem([x], parent=self.alphabet)
- self.tree.model().sourceModel().insert_row(data) # This doesnt work
- # self.tree.model().insert_row(data) # This works
- print 'clicked'
- def on_btn_reset_clicked(self):
- self.tree.model().reset()
- if __name__ == '__main__':
- app = QApplication([])
- widget = MyWidget()
- widget.show()
- app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement