1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from __future__ import annotations
from PySide6.QtCore import (Qt, QAbstractTableModel, QModelIndex)
class TableModel(QAbstractTableModel):
def __init__(self, addresses=None, parent=None):
super().__init__(parent)
if addresses is None:
self.addresses = []
else:
self.addresses = addresses
def rowCount(self, index=QModelIndex()):
""" Returns the number of rows the model holds. """
return len(self.addresses)
def columnCount(self, index=QModelIndex()):
""" Returns the number of columns the model holds. """
return 2
def data(self, index, role=Qt.ItemDataRole.DisplayRole):
""" Depending on the index and role given, return data. If not
returning data, return None (PySide equivalent of QT's
"invalid QVariant").
"""
if not index.isValid():
return None
if not 0 <= index.row() < len(self.addresses):
return None
if role == Qt.ItemDataRole.DisplayRole:
name = self.addresses[index.row()]["name"]
address = self.addresses[index.row()]["address"]
if index.column() == 0:
return name
elif index.column() == 1:
return address
return None
def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
""" Set the headers to be displayed. """
if role != Qt.ItemDataRole.DisplayRole:
return None
if orientation == Qt.Orientation.Horizontal:
if section == 0:
return "Name"
elif section == 1:
return "Address"
return None
def insertRows(self, position, rows=1, index=QModelIndex()):
""" Insert a row into the model. """
self.beginInsertRows(QModelIndex(), position, position + rows - 1)
for row in range(rows):
self.addresses.insert(position + row, {"name": "", "address": ""})
self.endInsertRows()
return True
def removeRows(self, position, rows=1, index=QModelIndex()):
""" Remove a row from the model. """
self.beginRemoveRows(QModelIndex(), position, position + rows - 1)
del self.addresses[position:position + rows]
self.endRemoveRows()
return True
def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
""" Adjust the data (set it to <value>) depending on the given
index and role.
"""
if role != Qt.ItemDataRole.EditRole:
return False
if index.isValid() and 0 <= index.row() < len(self.addresses):
address = self.addresses[index.row()]
if index.column() == 0:
address["name"] = value
elif index.column() == 1:
address["address"] = value
else:
return False
self.dataChanged.emit(index, index, 0)
return True
return False
def flags(self, index):
""" Set the item flags at the given index. Seems like we're
implementing this function just to see how it's done, as we
manually adjust each tableView to have NoEditTriggers.
"""
if not index.isValid():
return Qt.ItemIsEnabled
return Qt.ItemFlags(QAbstractTableModel.flags(self, index)
| Qt.ItemIsEditable)
|