aboutsummaryrefslogtreecommitdiffstats
path: root/examples/qml/usingmodel
diff options
context:
space:
mode:
Diffstat (limited to 'examples/qml/usingmodel')
-rw-r--r--examples/qml/usingmodel/doc/usingmodel.pngbin0 -> 2791 bytes
-rw-r--r--examples/qml/usingmodel/doc/usingmodel.rst11
-rw-r--r--examples/qml/usingmodel/usingmodel.py74
-rw-r--r--examples/qml/usingmodel/usingmodel.pyproject3
-rw-r--r--examples/qml/usingmodel/view.qml21
5 files changed, 109 insertions, 0 deletions
diff --git a/examples/qml/usingmodel/doc/usingmodel.png b/examples/qml/usingmodel/doc/usingmodel.png
new file mode 100644
index 000000000..b4240951b
--- /dev/null
+++ b/examples/qml/usingmodel/doc/usingmodel.png
Binary files differ
diff --git a/examples/qml/usingmodel/doc/usingmodel.rst b/examples/qml/usingmodel/doc/usingmodel.rst
new file mode 100644
index 000000000..06a1b27b0
--- /dev/null
+++ b/examples/qml/usingmodel/doc/usingmodel.rst
@@ -0,0 +1,11 @@
+Using Model Example
+===================
+
+.. tags:: Android
+
+A Python application that demonstrates how to use a :ref:`QAbstractListModel`
+with QML.
+
+.. image:: usingmodel.png
+ :width: 400
+ :alt: Using Model Screenshot
diff --git a/examples/qml/usingmodel/usingmodel.py b/examples/qml/usingmodel/usingmodel.py
new file mode 100644
index 000000000..008a1b94b
--- /dev/null
+++ b/examples/qml/usingmodel/usingmodel.py
@@ -0,0 +1,74 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import os
+from dataclasses import dataclass
+from pathlib import Path
+import sys
+from PySide6.QtCore import QAbstractListModel, Qt, QUrl, QByteArray
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtQuick import QQuickView
+from PySide6.QtQml import QmlElement, QmlSingleton
+
+
+QML_IMPORT_NAME = "PersonModel"
+QML_IMPORT_MAJOR_VERSION = 1
+
+
+@dataclass
+class Person:
+ name: str
+ myrole: str
+
+
+@QmlElement
+@QmlSingleton
+class PersonModel (QAbstractListModel):
+ MyRole = Qt.UserRole + 1
+
+ def __init__(self, data, parent=None):
+ super().__init__(parent)
+ self._data = data
+
+ def roleNames(self):
+ roles = {
+ PersonModel.MyRole: QByteArray(b'myrole'),
+ Qt.DisplayRole: QByteArray(b'display')
+ }
+ return roles
+
+ def rowCount(self, index):
+ return len(self._data)
+
+ def data(self, index, role):
+ d = self._data[index.row()]
+ if role == Qt.DisplayRole:
+ return d.name
+ if role == Qt.DecorationRole:
+ return Qt.black
+ if role == PersonModel.MyRole:
+ return d.myrole
+ return None
+
+ @staticmethod
+ def create(engine):
+ data = [Person('Qt', 'myrole'), Person('PySide', 'role2')]
+ return PersonModel(data)
+
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+
+ qml_file = os.fspath(Path(__file__).resolve().parent / 'view.qml')
+ view.setSource(QUrl.fromLocalFile(qml_file))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+
+ r = app.exec()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(r)
diff --git a/examples/qml/usingmodel/usingmodel.pyproject b/examples/qml/usingmodel/usingmodel.pyproject
new file mode 100644
index 000000000..600cdb409
--- /dev/null
+++ b/examples/qml/usingmodel/usingmodel.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["view.qml", "usingmodel.py"]
+}
diff --git a/examples/qml/usingmodel/view.qml b/examples/qml/usingmodel/view.qml
new file mode 100644
index 000000000..e8b1fb2fb
--- /dev/null
+++ b/examples/qml/usingmodel/view.qml
@@ -0,0 +1,21 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import PersonModel
+
+ListView {
+ width: 100
+ height: 100
+ anchors.fill: parent
+ model: PersonModel
+ delegate: Component {
+ Rectangle {
+ height: 25
+ width: 100
+ Text {
+ text: display + ": " + myrole
+ }
+ }
+ }
+}