Extending QML - Grouped Properties Example#
Grouped Properties.
This example builds on the the Extending QML - Default Property Example, the Extending QML - Inheritance and Coercion Example the Extending QML - Object and List Property Types Example and the Extending QML - Adding Types Example.
Running the Example#
The main.py
file in the example includes a simple shell application that
loads and runs the QML snippet shown below.
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
"""PySide6 port of the qml/examples/qml/referenceexamples/default example from Qt v6.x"""
from pathlib import Path
import sys
from PySide6.QtCore import QCoreApplication, QUrl
from PySide6.QtQml import QQmlComponent, QQmlEngine
from person import Boy, Girl
from birthdayparty import BirthdayParty
if __name__ == '__main__':
app = QCoreApplication(sys.argv)
qml_file = Path(__file__).parent / "example.qml"
url = QUrl.fromLocalFile(qml_file)
engine = QQmlEngine()
component = QQmlComponent(engine, url)
party = component.create()
if not party:
print(component.errors())
del engine
sys.exit(-1)
host = party.host
print(f"{host.name} is having a birthday!")
if isinstance(host, Boy):
print("He is inviting:")
else:
print("She is inviting:")
best_shoe = None
for g in range(party.guestCount()):
guest = party.guest(g)
name = guest.name
print(f" {name}")
if not best_shoe or best_shoe.shoe.price < guest.shoe.price:
best_shoe = guest;
if best_shoe:
print(f"{best_shoe.name} is wearing the best shoes!");
del engine
sys.exit(0)
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from PySide6.QtCore import QObject, ClassInfo, Property
from PySide6.QtQml import QmlElement, ListProperty
from person import Person
# To be used on the @QmlElement decorator
# (QML_IMPORT_MINOR_VERSION is optional)
QML_IMPORT_NAME = "examples.grouped.people"
QML_IMPORT_MAJOR_VERSION = 1
@QmlElement
@ClassInfo(DefaultProperty="guests")
class BirthdayParty(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._host = None
self._guests = []
@Property(Person)
def host(self):
return self._host
@host.setter
def host(self, h):
self._host = h
def guest(self, n):
return self._guests[n]
def guestCount(self):
return len(self._guests)
def appendGuest(self, guest):
self._guests.append(guest)
guests = ListProperty(Person, appendGuest)
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from PySide6.QtCore import QObject, Property
from PySide6.QtGui import QColor
from PySide6.QtQml import QmlAnonymous, QmlElement
# To be used on the @QmlElement decorator
# (QML_IMPORT_MINOR_VERSION is optional)
QML_IMPORT_NAME = "examples.grouped.people"
QML_IMPORT_MAJOR_VERSION = 1
@QmlAnonymous
class ShoeDescription(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._brand = ''
self._size = 0
self._price = 0
self._color = QColor()
@Property(str)
def brand(self):
return self._brand
@brand.setter
def brand(self, b):
self._brand = b
@Property(int)
def size(self):
return self._size
@size.setter
def size(self, s):
self._size = s
@Property(float)
def price(self):
return self._price
@price.setter
def price(self, p):
self._price = p
@Property(QColor)
def color(self):
return self._color
@color.setter
def color(self, c):
self._color = c
@QmlAnonymous
class Person(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._name = ''
self._shoe = ShoeDescription()
@Property(str)
def name(self):
return self._name
@name.setter
def name(self, n):
self._name = n
@Property(ShoeDescription)
def shoe(self):
return self._shoe
@QmlElement
class Boy(Person):
def __init__(self, parent=None):
super().__init__(parent)
@QmlElement
class Girl(Person):
def __init__(self, parent=None):
super().__init__(parent)
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import examples.grouped.people
BirthdayParty {
host: Boy {
name: "Bob Jones"
shoe { size: 12; color: "white"; brand: "Bikey"; price: 90.0 }
}
Boy {
name: "Leo Hodges"
shoe { size: 10; color: "black"; brand: "Thebok"; price: 59.95 }
}
Boy { name: "Jack Smith"
shoe {
size: 8
color: "blue"
brand: "Luma"
price: 19.95
}
}
Girl {
name: "Anne Brown"
shoe.size: 7
shoe.color: "red"
shoe.brand: "Job Macobs"
shoe.price: 699.99
}
}