Last active
July 26, 2024 10:32
-
-
Save zhanglongqi/6994c2bc611bacb4c68f to your computer and use it in GitHub Desktop.
PyQt tree model
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
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
longqi 20/Jan/16 22:42 | |
""" | |
""" | |
default.txt | |
""" | |
""" | |
Getting Started How to familiarize yourself with Qt Designer | |
Launching Designer Running the Qt Designer application | |
The User Interface How to interact with Qt Designer | |
Designing a Component Creating a GUI for your application | |
Creating a Dialog How to create a dialog | |
Composing the Dialog Putting widgets into the dialog example | |
Creating a Layout Arranging widgets on a form | |
Signal and Slot Connections Making widget communicate with each other | |
Using a Component in Your Application Generating code from forms | |
The Direct Approach Using a form without any adjustments | |
The Single Inheritance Approach Subclassing a form's base class | |
The Multiple Inheritance Approach Subclassing the form itself | |
Automatic Connections Connecting widgets using a naming scheme | |
A Dialog Without Auto-Connect How to connect widgets without a naming scheme | |
A Dialog With Auto-Connect Using automatic connections | |
Form Editing Mode How to edit a form in Qt Designer | |
Managing Forms Loading and saving forms | |
Editing a Form Basic editing techniques | |
The Property Editor Changing widget properties | |
The Object Inspector Examining the hierarchy of objects on a form | |
Layouts Objects that arrange widgets on a form | |
Applying and Breaking Layouts Managing widgets in layouts | |
Horizontal and Vertical Layouts Standard row and column layouts | |
The Grid Layout Arranging widgets in a matrix | |
Previewing Forms Checking that the design works | |
Using Containers How to group widgets together | |
General Features Common container features | |
Frames QFrame | |
Group Boxes QGroupBox | |
Stacked Widgets QStackedWidget | |
Tab Widgets QTabWidget | |
Toolbox Widgets QToolBox | |
Connection Editing Mode Connecting widgets together with signals and slots | |
Connecting Objects Making connections in Qt Designer | |
Editing Connections Changing existing connections | |
""" | |
from PyQt4 import QtCore, QtGui | |
class TreeItem(object): | |
def __init__(self, data, parent=None): | |
self.parentItem = parent | |
self.itemData = data | |
self.childItems = [] | |
def appendChild(self, item): | |
self.childItems.append(item) | |
def child(self, row): | |
return self.childItems[row] | |
def childCount(self): | |
return len(self.childItems) | |
def columnCount(self): | |
return len(self.itemData) | |
def data(self, column): | |
try: | |
return self.itemData[column] | |
except IndexError: | |
return None | |
def parent(self): | |
return self.parentItem | |
def row(self): | |
if self.parentItem: | |
return self.parentItem.childItems.index(self) | |
return 0 | |
class TreeModel(QtCore.QAbstractItemModel): | |
def __init__(self, data, parent=None): | |
super(TreeModel, self).__init__(parent) | |
self.rootItem = TreeItem(("Title", "Summary")) | |
self.setupModelData(data.split('\n'), self.rootItem) | |
def columnCount(self, parent): | |
if parent.isValid(): | |
return parent.internalPointer().columnCount() | |
else: | |
return self.rootItem.columnCount() | |
def data(self, index, role): | |
if not index.isValid(): | |
return None | |
if role != QtCore.Qt.DisplayRole: | |
return None | |
item = index.internalPointer() | |
return item.data(index.column()) | |
def flags(self, index): | |
if not index.isValid(): | |
return QtCore.Qt.NoItemFlags | |
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | |
def headerData(self, section, orientation, role): | |
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: | |
return self.rootItem.data(section) | |
return None | |
def index(self, row, column, parent): | |
if not self.hasIndex(row, column, parent): | |
return QtCore.QModelIndex() | |
if not parent.isValid(): | |
parentItem = self.rootItem | |
else: | |
parentItem = parent.internalPointer() | |
childItem = parentItem.child(row) | |
if childItem: | |
return self.createIndex(row, column, childItem) | |
else: | |
return QtCore.QModelIndex() | |
def parent(self, index): | |
if not index.isValid(): | |
return QtCore.QModelIndex() | |
childItem = index.internalPointer() | |
parentItem = childItem.parent() | |
if parentItem == self.rootItem: | |
return QtCore.QModelIndex() | |
return self.createIndex(parentItem.row(), 0, parentItem) | |
def rowCount(self, parent): | |
if parent.column() > 0: | |
return 0 | |
if not parent.isValid(): | |
parentItem = self.rootItem | |
else: | |
parentItem = parent.internalPointer() | |
return parentItem.childCount() | |
def setupModelData(self, lines, parent): | |
parents = [parent] | |
indentations = [0] | |
number = 0 | |
while number < len(lines): | |
position = 0 | |
while position < len(lines[number]): | |
if lines[number][position] != ' ': | |
break | |
position += 1 | |
lineData = lines[number][position:].trimmed() | |
if lineData: | |
# Read the column data from the rest of the line. | |
columnData = [s for s in lineData.split('\t') if s] | |
if position > indentations[-1]: | |
# The last child of the current parent is now the new | |
# parent unless the current parent has no children. | |
if parents[-1].childCount() > 0: | |
parents.append(parents[-1].child(parents[-1].childCount() - 1)) | |
indentations.append(position) | |
else: | |
while position < indentations[-1] and len(parents) > 0: | |
parents.pop() | |
indentations.pop() | |
# Append a new item to the current parent's list of children. | |
parents[-1].appendChild(TreeItem(columnData, parents[-1])) | |
number += 1 | |
if __name__ == '__main__': | |
import sys | |
app = QtGui.QApplication(sys.argv) | |
f = QtCore.QFile('default.txt') | |
f.open(QtCore.QIODevice.ReadOnly) | |
model = TreeModel(f.readAll()) | |
f.close() | |
view = QtGui.QTreeView() | |
view.setModel(model) | |
view.setWindowTitle("Simple Tree Model") | |
view.show() | |
sys.exit(app.exec_()) |
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
text = '''Getting Started How to familiarize yourself with Qt Designer | |
Launching Designer Running the Qt Designer application | |
The User Interface How to interact with Qt Designer | |
Designing a Component Creating a GUI for your application | |
Creating a Dialog How to create a dialog | |
Composing the Dialog Putting widgets into the dialog example | |
Creating a Layout Arranging widgets on a form | |
Signal and Slot Connections Making widget communicate with each other | |
Using a Component in Your Application Generating code from forms | |
The Direct Approach Using a form without any adjustments | |
The Single Inheritance Approach Subclassing a form's base class | |
The Multiple Inheritance Approach Subclassing the form itself | |
Automatic Connections Connecting widgets using a naming scheme | |
A Dialog Without Auto-Connect How to connect widgets without a naming scheme | |
A Dialog With Auto-Connect Using automatic connections | |
Form Editing Mode How to edit a form in Qt Designer | |
Managing Forms Loading and saving forms | |
Editing a Form Basic editing techniques | |
The Property Editor Changing widget properties | |
The Object Inspector Examining the hierarchy of objects on a form | |
Layouts Objects that arrange widgets on a form | |
Applying and Breaking Layouts Managing widgets in layouts | |
Horizontal and Vertical Layouts Standard row and column layouts | |
The Grid Layout Arranging widgets in a matrix | |
Previewing Forms Checking that the design works | |
Using Containers How to group widgets together | |
General Features Common container features | |
Frames QFrame | |
Group Boxes QGroupBox | |
Stacked Widgets QStackedWidget | |
Tab Widgets QTabWidget | |
Toolbox Widgets QToolBox | |
Connection Editing Mode Connecting widgets together with signals and slots | |
Connecting Objects Making connections in Qt Designer | |
Editing Connections Changing existing connections | |
''' | |
from PyQt6 import QtWidgets | |
from PyQt6 import QtCore, QtGui | |
from PyQt6.QtCore import Qt | |
class TreeItem: | |
def __init__(self, data, parent=None): | |
self.parentItem = parent | |
self.itemData = data | |
self.childItems = [] | |
def appendChild(self, item): | |
self.childItems.append(item) | |
def child(self, row): | |
return self.childItems[row] | |
def childCount(self): | |
return len(self.childItems) | |
def columnCount(self): | |
return len(self.itemData) | |
def data(self, column): | |
try: | |
return self.itemData[column] | |
except IndexError: | |
return None | |
def parent(self): | |
return self.parentItem | |
def row(self): | |
if self.parentItem: | |
return self.parentItem.childItems.index(self) | |
return 0 | |
class TreeModel(QtCore.QAbstractItemModel): | |
def __init__(self, data, parent=None): | |
super(TreeModel, self).__init__(parent) | |
self.rootItem = TreeItem(("Title", "Summary")) | |
self.setupModelData(data.split('\n'), self.rootItem) | |
def columnCount(self, parent): | |
if parent.isValid(): | |
return parent.internalPointer().columnCount() | |
else: | |
return self.rootItem.columnCount() | |
def data(self, index, role): | |
if not index.isValid(): | |
return None | |
if role != Qt.ItemDataRole.DisplayRole: | |
return None | |
item = index.internalPointer() | |
return item.data(index.column()) | |
def flags(self, index): | |
if not index.isValid(): | |
return QtCore.Qt.NoItemFlags | |
return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable | |
def headerData(self, section, orientation, role): | |
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole: | |
return self.rootItem.data(section) | |
return None | |
def index(self, row, column, parent): | |
if not self.hasIndex(row, column, parent): | |
return QtCore.QModelIndex() | |
if not parent.isValid(): | |
parentItem = self.rootItem | |
else: | |
parentItem = parent.internalPointer() | |
childItem = parentItem.child(row) | |
if childItem: | |
return self.createIndex(row, column, childItem) | |
else: | |
return QtCore.QModelIndex() | |
def parent(self, index): | |
if not index.isValid(): | |
return QtCore.QModelIndex() | |
childItem = index.internalPointer() | |
parentItem = childItem.parent() | |
if parentItem == self.rootItem: | |
return QtCore.QModelIndex() | |
return self.createIndex(parentItem.row(), 0, parentItem) | |
def rowCount(self, parent): | |
if parent.column() > 0: | |
return 0 | |
if not parent.isValid(): | |
parentItem = self.rootItem | |
else: | |
parentItem = parent.internalPointer() | |
return parentItem.childCount() | |
def setupModelData(self, lines, parent): | |
parents = [parent] | |
indentations = [0] | |
number = 0 | |
while number < len(lines): | |
position = 0 | |
while position < len(lines[number]): | |
if lines[number][position] != ' ': | |
break | |
position += 1 | |
lineData = lines[number][position:].strip() | |
if lineData: | |
# Read the column data from the rest of the line. | |
columnData = [s for s in lineData.split('\t') if s] | |
if position > indentations[-1]: | |
# The last child of the current parent is now the new | |
# parent unless the current parent has no children. | |
if parents[-1].childCount() > 0: | |
parents.append(parents[-1].child(parents[-1].childCount() - 1)) | |
indentations.append(position) | |
else: | |
while position < indentations[-1] and len(parents) > 0: | |
parents.pop() | |
indentations.pop() | |
# Append a new item to the current parent's list of children. | |
parents[-1].appendChild(TreeItem(columnData, parents[-1])) | |
number += 1 | |
if __name__ == '__main__': | |
import sys | |
app = QtWidgets.QApplication(sys.argv) | |
model = TreeModel(text) | |
view = QtWidgets.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
Thank you!! This works for PyQt6