1#!/usr/bin/env python 2 3 4############################################################################# 5## 6## Copyright (C) 2013 Riverbank Computing Limited. 7## Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). 8## All rights reserved. 9## 10## This file is part of the examples of PyQt. 11## 12## $QT_BEGIN_LICENSE:BSD$ 13## You may use this file under the terms of the BSD license as follows: 14## 15## "Redistribution and use in source and binary forms, with or without 16## modification, are permitted provided that the following conditions are 17## met: 18## * Redistributions of source code must retain the above copyright 19## notice, this list of conditions and the following disclaimer. 20## * Redistributions in binary form must reproduce the above copyright 21## notice, this list of conditions and the following disclaimer in 22## the documentation and/or other materials provided with the 23## distribution. 24## * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor 25## the names of its contributors may be used to endorse or promote 26## products derived from this software without specific prior written 27## permission. 28## 29## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 32## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 35## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 39## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 40## $QT_END_LICENSE$ 41## 42############################################################################# 43 44 45import sys 46 47from PyQt5.QtCore import (pyqtProperty, Q_CLASSINFO, QCoreApplication, QObject, 48 QUrl) 49from PyQt5.QtQml import (qmlRegisterType, QQmlComponent, QQmlEngine, 50 QQmlListProperty) 51 52 53QML = b''' 54import People 1.0 55 56BirthdayParty { 57 host: Boy { 58 name: "Bob Jones" 59 shoeSize: 12 60 } 61 62 Boy { name: "Leo Hodges" } 63 Boy { name: "Jack Smith" } 64 Girl { name: "Anne Brown" } 65} 66''' 67 68 69class Person(QObject): 70 def __init__(self, parent=None): 71 super(Person, self).__init__(parent) 72 73 self._name = '' 74 self._shoeSize = 0 75 76 @pyqtProperty(str) 77 def name(self): 78 return self._name 79 80 @name.setter 81 def name(self, name): 82 self._name = name 83 84 @pyqtProperty(int) 85 def shoeSize(self): 86 return self._shoeSize 87 88 @shoeSize.setter 89 def shoeSize(self, shoeSize): 90 self._shoeSize = shoeSize 91 92 93class Boy(Person): 94 pass 95 96 97class Girl(Person): 98 pass 99 100 101class BirthdayParty(QObject): 102 Q_CLASSINFO('DefaultProperty', 'guests') 103 104 def __init__(self, parent=None): 105 super(BirthdayParty, self).__init__(parent) 106 107 self._host = None 108 self._guests = [] 109 110 @pyqtProperty(Person) 111 def host(self): 112 return self._host 113 114 @host.setter 115 def host(self, host): 116 self._host = host 117 118 @pyqtProperty(QQmlListProperty) 119 def guests(self): 120 return QQmlListProperty(Person, self, self._guests) 121 122 123app = QCoreApplication(sys.argv) 124 125qmlRegisterType(BirthdayParty, "People", 1, 0, "BirthdayParty") 126qmlRegisterType(Person) 127qmlRegisterType(Boy, "People", 1, 0, "Boy") 128qmlRegisterType(Girl, "People", 1, 0, "Girl") 129 130engine = QQmlEngine() 131 132component = QQmlComponent(engine) 133component.setData(QML, QUrl()) 134 135party = component.create() 136 137if party is not None and party.host is not None: 138 print("\"%s\" is having a birthday!" % party.host.name) 139 140 if isinstance(party.host, Boy): 141 print("He is inviting:") 142 else: 143 print("She is inviting:") 144 145 for guest in party.guests: 146 print(" \"%s\"" % guest.name) 147else: 148 for e in component.errors(): 149 print("Error:", e.toString()); 150