aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets/itemviews/address_book/tablemodel.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/itemviews/address_book/tablemodel.py')
-rw-r--r--examples/widgets/itemviews/address_book/tablemodel.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/examples/widgets/itemviews/address_book/tablemodel.py b/examples/widgets/itemviews/address_book/tablemodel.py
new file mode 100644
index 000000000..3c1dbd4cc
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/tablemodel.py
@@ -0,0 +1,109 @@
+# 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 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.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.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.DisplayRole):
+ """ Set the headers to be displayed. """
+ if role != Qt.DisplayRole:
+ return None
+
+ if orientation == Qt.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.EditRole):
+ """ Adjust the data (set it to <value>) depending on the given
+ index and role.
+ """
+ if role != Qt.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)