Created
May 10, 2019 10:48
-
-
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
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
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