Created
April 4, 2023 12:00
-
-
Save nmstoker/07f55c3c6471dbe3b1384978db4c73d2 to your computer and use it in GitHub Desktop.
TreeModel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from PySide6.QtCore import Qt, QAbstractItemModel, QModelIndex, QVariant | |
class Node: | |
def __init__(self, name, parent=None, private_data=None): | |
self.name = name | |
self.parentNode = parent | |
self.childNodes = [] | |
self.privateData = private_data | |
if parent: | |
parent.addChild(self) | |
def addChild(self, child): | |
self.childNodes.append(child) | |
def row(self): | |
if self.parentNode: | |
return self.parentNode.childNodes.index(self) | |
return 0 | |
def childCount(self): | |
return len(self.childNodes) | |
def child(self, row): | |
return self.childNodes[row] | |
def parent(self): | |
return self.parentNode | |
def data(self, column, role=Qt.DisplayRole): | |
if role == Qt.DisplayRole: | |
if column == 0: | |
return self.name | |
elif role == Qt.UserRole: | |
return self.privateData | |
return None | |
def setData(self, column, value, role=Qt.EditRole): | |
if role == Qt.EditRole: | |
if column == 0: | |
self.name = value | |
return True | |
elif role == Qt.UserRole: | |
self.privateData = value | |
return True | |
return False | |
class TreeModel(QAbstractItemModel): | |
def __init__(self, rootNode, parent=None): | |
super().__init__(parent) | |
self.rootNode = rootNode | |
def index(self, row, column, parent=QModelIndex()): | |
if not parent.isValid(): | |
parentNode = self.rootNode | |
else: | |
parentNode = parent.internalPointer() | |
if row >= parentNode.childCount(): | |
return QModelIndex() | |
childNode = parentNode.child(row) | |
if childNode: | |
return self.createIndex(row, column, childNode) | |
else: | |
return QModelIndex() | |
def parent(self, index): | |
if not index.isValid(): | |
return QModelIndex() | |
childNode = index.internalPointer() | |
parentNode = childNode.parent() | |
if parentNode == self.rootNode: | |
return QModelIndex() | |
return self.createIndex(parentNode.row(), 0, parentNode) | |
def rowCount(self, parent=QModelIndex()): | |
if not parent.isValid(): | |
parentNode = self.rootNode | |
else: | |
parentNode = parent.internalPointer() | |
return parentNode.childCount() | |
def columnCount(self, parent=QModelIndex()): | |
return 1 | |
def data(self, index, role=Qt.DisplayRole): | |
if not index.isValid(): | |
return None | |
node = index.internalPointer() | |
if role == Qt.DisplayRole or role == Qt.EditRole or role == Qt.UserRole: | |
return node.data(index.column(), role) | |
return None | |
def setData(self, index, value, role=Qt.EditRole): | |
if not index.isValid(): | |
return False | |
node = index.internalPointer() | |
if node.setData(index.column(), value, role): | |
self.dataChanged.emit(index, index, [role]) | |
return True | |
return False | |
def flags(self, index): | |
if not index.isValid(): | |
return Qt.NoItemFlags | |
return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable | |
if __name__ == '__main__': | |
rootNode = Node('Root') | |
child1Node = Node('Child 1', rootNode, {'private_key': 'private_value_1'}) | |
child2Node = Node('Child 2', rootNode, {'private_key': 'private_value_2'}) | |
grandchildNode = Node('Grandchild', child2Node, {'private_key': 'private_value_3'}) | |
app = QApplication(sys.argv) | |
treeView |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment