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.

"""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:
        del engine
    host = party.host
    print(f"{host.name} is having a birthday!")
    if isinstance(host, Boy):
        print("He is inviting:")
        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
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_NAME = "examples.grouped.people"

class BirthdayParty(QObject):

    def __init__(self, parent=None):
        self._host = None
        self._guests = []

    def host(self):
        return self._host

    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):

    guests = ListProperty(Person, appendGuest)
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_NAME = "examples.grouped.people"

class ShoeDescription(QObject):
    def __init__(self, parent=None):
        self._brand = ''
        self._size = 0
        self._price = 0
        self._color = QColor()

    def brand(self):
        return self._brand

    def brand(self, b):
        self._brand = b

    def size(self):
        return self._size

    def size(self, s):
        self._size = s

    def price(self):
        return self._price

    def price(self, p):
        self._price = p

    def color(self):
        return self._color

    def color(self, c):
        self._color = c

class Person(QObject):
    def __init__(self, parent=None):
        self._name = ''
        self._shoe = ShoeDescription()

    def name(self):
        return self._name

    def name(self, n):
        self._name = n

    def shoe(self):
        return self._shoe

class Boy(Person):
    def __init__(self, parent=None):

class Girl(Person):
    def __init__(self, parent=None):
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