Skip to content

Instantly share code, notes, and snippets.

@danieljfarrell
Created May 10, 2019 10:48
Show Gist options
  • Save danieljfarrell/15db4ed6fd2843fe40feb026090fae9f to your computer and use it in GitHub Desktop.
Save danieljfarrell/15db4ed6fd2843fe40feb026090fae9f to your computer and use it in GitHub Desktop.
Example of using QTreeView with QAbstractItemModel from https://www.hardcoded.net/articles/using_qtreeview_with_qabstractitemmodel
if __name__ == "__main__":
from PyQt5.QtCore import QAbstractItemModel, QFile, QIODevice, QModelIndex, Qt
from PyQt5.QtWidgets import QApplication, QTreeView
import sys
from tree_model import TreeModel, TreeNode, RefNode
class NamedElement(object): # your internal structure
def __init__(self, name, subelements):
super(NamedElement, self).__init__()
self.name = name
self.subelements = subelements
def __repr__(self):
return "NamedElement(name='{}', subelements={})".format(
self.name, [x.name for x in self.subelements]
)
class NamedNode(TreeNode):
def __init__(self, ref, parent, row):
self.ref = ref
super(NamedNode, self).__init__(ref, parent, row)
def _getChildren(self):
return self.ref.subelements
def _createNode(self, ref, row):
# print("NamedNode._createNode ref: '{}', row: '{}'".format(ref, row))
return NamedNode(ref, self, row)
class NamesModel(TreeModel):
def __init__(self, rootElements, **kwargs):
self.rootElements = rootElements
super(NamesModel, self).__init__(**kwargs)
def _getRootNodes(self):
return [
NamedNode(elem, None, index)
for index, elem in enumerate(self.rootElements)
]
def columnCount(self, parent):
return 1
def data(self, index, role):
if not index.isValid():
return None
node = index.internalPointer()
if role == Qt.DisplayRole and index.column() == 0:
return node.ref.name
return None
def headerData(self, section, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 0:
return "Name"
return None
def _getChildren(self):
# Returns the actual domain objects
return [n.ref for n in self._getRootNodes()]
def _createNode(self, ref, row):
print("NamesModel._createNode ref: '{}', row: '{}'".format(ref, row))
return NamedNode(ref, None, row)
raise ValueError("NamesModel _createNode")
app = QApplication(sys.argv)
elements = [
NamedElement("A", [NamedElement("B", [NamedElement("C", [])])]),
NamedElement("D", []),
NamedElement("E", []),
]
model = NamesModel(elements)
view = QTreeView()
view.setModel(model)
view.setWindowTitle("Simple Tree Model")
view.show()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment