Skip to content

Instantly share code, notes, and snippets.

@nmstoker
Created April 4, 2023 12:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nmstoker/07f55c3c6471dbe3b1384978db4c73d2 to your computer and use it in GitHub Desktop.
Save nmstoker/07f55c3c6471dbe3b1384978db4c73d2 to your computer and use it in GitHub Desktop.
TreeModel
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