diff options
Diffstat (limited to 'examples/qml/usingmodel')
-rw-r--r-- | examples/qml/usingmodel/doc/usingmodel.png | bin | 0 -> 2791 bytes | |||
-rw-r--r-- | examples/qml/usingmodel/doc/usingmodel.rst | 11 | ||||
-rw-r--r-- | examples/qml/usingmodel/usingmodel.py | 74 | ||||
-rw-r--r-- | examples/qml/usingmodel/usingmodel.pyproject | 3 | ||||
-rw-r--r-- | examples/qml/usingmodel/view.qml | 21 |
5 files changed, 109 insertions, 0 deletions
diff --git a/examples/qml/usingmodel/doc/usingmodel.png b/examples/qml/usingmodel/doc/usingmodel.png Binary files differnew file mode 100644 index 000000000..b4240951b --- /dev/null +++ b/examples/qml/usingmodel/doc/usingmodel.png 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 + } + } + } +} |