| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: https://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the test suite of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at https://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU |
| 19 | ** General Public License version 3 as published by the Free Software |
| 20 | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT |
| 21 | ** included in the packaging of this file. Please review the following |
| 22 | ** information to ensure the GNU General Public License requirements will |
| 23 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 24 | ** |
| 25 | ** $QT_END_LICENSE$ |
| 26 | ** |
| 27 | ****************************************************************************/ |
| 28 | #include "testtypes.h" |
| 29 | #ifndef QT_NO_WIDGETS |
| 30 | # include <QWidget> |
| 31 | # include <QPlainTextEdit> |
| 32 | #endif |
| 33 | #include <QQmlEngine> |
| 34 | #include <QJSEngine> |
| 35 | #include <QThread> |
| 36 | |
| 37 | class BaseExtensionObject : public QObject |
| 38 | { |
| 39 | Q_OBJECT |
| 40 | Q_PROPERTY(int baseExtendedProperty READ extendedProperty WRITE setExtendedProperty NOTIFY extendedPropertyChanged) |
| 41 | public: |
| 42 | BaseExtensionObject(QObject *parent) : QObject(parent), m_value(0) {} |
| 43 | |
| 44 | int extendedProperty() const { return m_value; } |
| 45 | void setExtendedProperty(int v) { m_value = v; emit extendedPropertyChanged(); } |
| 46 | |
| 47 | signals: |
| 48 | void extendedPropertyChanged(); |
| 49 | private: |
| 50 | int m_value; |
| 51 | }; |
| 52 | |
| 53 | class AbstractExtensionObject : public QObject |
| 54 | { |
| 55 | Q_OBJECT |
| 56 | Q_PROPERTY(int abstractProperty READ abstractProperty WRITE setAbstractProperty NOTIFY abstractPropertyChanged) |
| 57 | public: |
| 58 | |
| 59 | AbstractExtensionObject(QObject *parent = nullptr) : QObject(parent), m_abstractProperty(-1) {} |
| 60 | |
| 61 | void setAbstractProperty(int abstractProperty) { m_abstractProperty = abstractProperty; emit abstractPropertyChanged(); } |
| 62 | int abstractProperty() const { return m_abstractProperty; } |
| 63 | |
| 64 | virtual void shouldBeImplemented() = 0; |
| 65 | |
| 66 | signals: |
| 67 | void abstractPropertyChanged(); |
| 68 | |
| 69 | private: |
| 70 | int m_abstractProperty; |
| 71 | }; |
| 72 | |
| 73 | class ImplementedExtensionObject : public AbstractExtensionObject |
| 74 | { |
| 75 | Q_OBJECT |
| 76 | Q_PROPERTY(int implementedProperty READ implementedProperty WRITE setImplementedProperty NOTIFY implementedPropertyChanged) |
| 77 | public: |
| 78 | ImplementedExtensionObject(QObject *parent = nullptr) : AbstractExtensionObject(parent), m_implementedProperty(883) {} |
| 79 | void shouldBeImplemented() {} |
| 80 | |
| 81 | void setImplementedProperty(int implementedProperty) { m_implementedProperty = implementedProperty; emit implementedPropertyChanged(); } |
| 82 | int implementedProperty() const { return m_implementedProperty; } |
| 83 | |
| 84 | signals: |
| 85 | void implementedPropertyChanged(); |
| 86 | |
| 87 | private: |
| 88 | int m_implementedProperty; |
| 89 | }; |
| 90 | |
| 91 | class ExtensionObject : public QObject |
| 92 | { |
| 93 | Q_OBJECT |
| 94 | Q_PROPERTY(int extendedProperty READ extendedProperty WRITE setExtendedProperty NOTIFY extendedPropertyChanged) |
| 95 | public: |
| 96 | ExtensionObject(QObject *parent) : QObject(parent), m_value(0) {} |
| 97 | |
| 98 | int extendedProperty() const { return m_value; } |
| 99 | void setExtendedProperty(int v) { m_value = v; emit extendedPropertyChanged(); } |
| 100 | |
| 101 | signals: |
| 102 | void extendedPropertyChanged(); |
| 103 | private: |
| 104 | int m_value; |
| 105 | }; |
| 106 | |
| 107 | class DefaultPropertyExtensionObject : public QObject |
| 108 | { |
| 109 | Q_OBJECT |
| 110 | Q_CLASSINFO("DefaultProperty" , "firstProperty" ) |
| 111 | public: |
| 112 | DefaultPropertyExtensionObject(QObject *parent) : QObject(parent) {} |
| 113 | }; |
| 114 | |
| 115 | class QWidgetDeclarativeUI : public QObject |
| 116 | { |
| 117 | Q_OBJECT |
| 118 | |
| 119 | Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged) |
| 120 | |
| 121 | signals: |
| 122 | void widthChanged(); |
| 123 | |
| 124 | public: |
| 125 | QWidgetDeclarativeUI(QObject *other) : QObject(other) { } |
| 126 | |
| 127 | public: |
| 128 | int width() const { return 0; } |
| 129 | void setWidth(int) { } |
| 130 | }; |
| 131 | |
| 132 | void MyQmlObject::v8function(QQmlV4Function *function) |
| 133 | { |
| 134 | function->v4engine()->throwError(QStringLiteral("Exception thrown from within QObject slot" )); |
| 135 | } |
| 136 | |
| 137 | static QJSValue script_api(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 138 | { |
| 139 | Q_UNUSED(engine) |
| 140 | |
| 141 | static int testProperty = 13; |
| 142 | QJSValue v = scriptEngine->newObject(); |
| 143 | v.setProperty(name: "scriptTestProperty" , value: testProperty++); |
| 144 | return v; |
| 145 | } |
| 146 | |
| 147 | static QJSValue readonly_script_api(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 148 | { |
| 149 | Q_UNUSED(engine) |
| 150 | |
| 151 | static int testProperty = 42; |
| 152 | QJSValue v = scriptEngine->newObject(); |
| 153 | v.setProperty(name: "scriptTestProperty" , value: testProperty++); |
| 154 | |
| 155 | // now freeze it so that it's read-only |
| 156 | QJSValue freezeFunction = scriptEngine->evaluate(program: "(function(obj) { return Object.freeze(obj); })" ); |
| 157 | v = freezeFunction.call(args: QJSValueList() << v); |
| 158 | |
| 159 | return v; |
| 160 | } |
| 161 | |
| 162 | static QObject *testImportOrder_api(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 163 | { |
| 164 | Q_UNUSED(engine) |
| 165 | Q_UNUSED(scriptEngine) |
| 166 | |
| 167 | testImportOrderApi *o = new testImportOrderApi(37); |
| 168 | return o; |
| 169 | } |
| 170 | |
| 171 | static QObject *testImportOrder_api1(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 172 | { |
| 173 | Q_UNUSED(engine) |
| 174 | Q_UNUSED(scriptEngine) |
| 175 | |
| 176 | testImportOrderApi *o = new testImportOrderApi(1); |
| 177 | return o; |
| 178 | } |
| 179 | |
| 180 | static QObject *testImportOrder_api2(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 181 | { |
| 182 | Q_UNUSED(engine) |
| 183 | Q_UNUSED(scriptEngine) |
| 184 | |
| 185 | testImportOrderApi *o = new testImportOrderApi(2); |
| 186 | return o; |
| 187 | } |
| 188 | |
| 189 | static QObject *qobject_api(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 190 | { |
| 191 | Q_UNUSED(engine) |
| 192 | Q_UNUSED(scriptEngine) |
| 193 | |
| 194 | testQObjectApi *o = new testQObjectApi(); |
| 195 | o->setQObjectTestProperty(20); |
| 196 | o->setQObjectTestWritableProperty(50); |
| 197 | o->setQObjectTestWritableFinalProperty(10); |
| 198 | return o; |
| 199 | } |
| 200 | |
| 201 | static QObject *qobject_api_two(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 202 | { |
| 203 | Q_UNUSED(engine) |
| 204 | Q_UNUSED(scriptEngine) |
| 205 | |
| 206 | testQObjectApiTwo *o = new testQObjectApiTwo; |
| 207 | return o; |
| 208 | } |
| 209 | |
| 210 | static QObject *qobject_api_engine_parent(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 211 | { |
| 212 | Q_UNUSED(scriptEngine) |
| 213 | |
| 214 | static int testProperty = 26; |
| 215 | testQObjectApi *o = new testQObjectApi(engine); |
| 216 | o->setQObjectTestProperty(testProperty++); |
| 217 | return o; |
| 218 | } |
| 219 | |
| 220 | static QObject *fallback_bindings_object(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 221 | { |
| 222 | Q_UNUSED(engine) |
| 223 | Q_UNUSED(scriptEngine) |
| 224 | |
| 225 | return new FallbackBindingsObject(); |
| 226 | } |
| 227 | |
| 228 | static QObject *fallback_bindings_derived(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 229 | { |
| 230 | Q_UNUSED(engine) |
| 231 | Q_UNUSED(scriptEngine) |
| 232 | |
| 233 | return new FallbackBindingsDerived(); |
| 234 | } |
| 235 | |
| 236 | class MyWorkerObjectThread : public QThread |
| 237 | { |
| 238 | public: |
| 239 | MyWorkerObjectThread(MyWorkerObject *o) : QThread(o), o(o) { start(); } |
| 240 | |
| 241 | virtual void run() { |
| 242 | emit o->done(result: QLatin1String("good" )); |
| 243 | } |
| 244 | |
| 245 | MyWorkerObject *o; |
| 246 | }; |
| 247 | |
| 248 | MyWorkerObject::~MyWorkerObject() |
| 249 | { |
| 250 | if (m_thread) |
| 251 | m_thread->wait(); |
| 252 | } |
| 253 | |
| 254 | void MyWorkerObject::doIt() |
| 255 | { |
| 256 | Q_ASSERT(!m_thread); |
| 257 | m_thread = new MyWorkerObjectThread(this); |
| 258 | } |
| 259 | |
| 260 | class MyDateClass : public QObject |
| 261 | { |
| 262 | Q_OBJECT |
| 263 | public: |
| 264 | Q_INVOKABLE QDateTime invalidDate() |
| 265 | { |
| 266 | return QDateTime(); |
| 267 | } |
| 268 | }; |
| 269 | |
| 270 | class MiscTypeTestClass : public QObject |
| 271 | { |
| 272 | Q_OBJECT |
| 273 | public: |
| 274 | Q_INVOKABLE QUrl invalidUrl() |
| 275 | { |
| 276 | return QUrl(); |
| 277 | } |
| 278 | |
| 279 | Q_INVOKABLE QUrl validUrl() |
| 280 | { |
| 281 | return QUrl("http://wwww.qt-project.org" ); |
| 282 | } |
| 283 | }; |
| 284 | |
| 285 | class MyStringClass : public QObject |
| 286 | { |
| 287 | Q_OBJECT |
| 288 | public: |
| 289 | Q_INVOKABLE QStringList strings(QStringList stringList) const |
| 290 | { |
| 291 | return stringList; |
| 292 | } |
| 293 | Q_INVOKABLE QVector<QString> stringsVector(const QStringList& stringList) const |
| 294 | { |
| 295 | return stringList.toVector(); |
| 296 | } |
| 297 | Q_INVOKABLE |
| 298 | std::vector<QString> stringsStdVector(const QStringList& stringList) const |
| 299 | { |
| 300 | return std::vector<QString>(stringList.begin(), stringList.end()); |
| 301 | } |
| 302 | Q_INVOKABLE QList<int> integers(QList<int> v) const |
| 303 | { |
| 304 | return v; |
| 305 | } |
| 306 | Q_INVOKABLE QList<qreal> reals(QList<qreal> v) const |
| 307 | { |
| 308 | return v; |
| 309 | } |
| 310 | Q_INVOKABLE QList<bool> bools(QList<bool> v) const |
| 311 | { |
| 312 | return v; |
| 313 | } |
| 314 | Q_INVOKABLE QVector<int> integerVector(QVector<int> v) const |
| 315 | { |
| 316 | return v; |
| 317 | } |
| 318 | Q_INVOKABLE |
| 319 | std::vector<int> integerStdVector(std::vector<int> v) const |
| 320 | { |
| 321 | return v; |
| 322 | } |
| 323 | Q_INVOKABLE QVector<qreal> realVector(QVector<qreal> v) const |
| 324 | { |
| 325 | return v; |
| 326 | } |
| 327 | Q_INVOKABLE |
| 328 | std::vector<qreal> realStdVector(std::vector<qreal> v) const |
| 329 | { |
| 330 | return v; |
| 331 | } |
| 332 | Q_INVOKABLE QVector<bool> boolVector(QVector<bool> v) const |
| 333 | { |
| 334 | return v; |
| 335 | } |
| 336 | Q_INVOKABLE |
| 337 | std::vector<bool> boolStdVector(std::vector<bool> v) const |
| 338 | { |
| 339 | return v; |
| 340 | } |
| 341 | }; |
| 342 | |
| 343 | static MyInheritedQmlObject *theSingletonObject = nullptr; |
| 344 | |
| 345 | static QObject *inheritedQmlObject_provider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */) |
| 346 | { |
| 347 | theSingletonObject = new MyInheritedQmlObject(); |
| 348 | return theSingletonObject; |
| 349 | } |
| 350 | |
| 351 | bool MyInheritedQmlObject::isItYouQObject(QObject *o) |
| 352 | { |
| 353 | return o && o == theSingletonObject; |
| 354 | } |
| 355 | |
| 356 | bool MyInheritedQmlObject::isItYouMyQmlObject(MyQmlObject *o) |
| 357 | { |
| 358 | return o && o == theSingletonObject; |
| 359 | } |
| 360 | |
| 361 | bool MyInheritedQmlObject::isItYouMyInheritedQmlObject(MyInheritedQmlObject *o) |
| 362 | { |
| 363 | return o && o == theSingletonObject; |
| 364 | } |
| 365 | |
| 366 | class TestTypeCppSingleton : public QObject |
| 367 | { |
| 368 | Q_OBJECT |
| 369 | Q_PROPERTY(int foo READ foo) |
| 370 | |
| 371 | Q_CLASSINFO("DefaultProperty" , "foo" ) |
| 372 | public: |
| 373 | int foo() { return 0; } |
| 374 | static TestTypeCppSingleton *instance() { |
| 375 | static TestTypeCppSingleton cppSingleton; |
| 376 | return &cppSingleton; |
| 377 | } |
| 378 | private: |
| 379 | TestTypeCppSingleton(){} |
| 380 | ~TestTypeCppSingleton() { |
| 381 | // just to make sure it crashes on double delete |
| 382 | static int a = 0; |
| 383 | static int *ptr = &a; |
| 384 | *ptr = 1; |
| 385 | ptr = nullptr; |
| 386 | } |
| 387 | }; |
| 388 | |
| 389 | QObject *testTypeCppProvider(QQmlEngine *engine, QJSEngine *scriptEngine) |
| 390 | { |
| 391 | Q_UNUSED(engine); |
| 392 | Q_UNUSED(scriptEngine); |
| 393 | TestTypeCppSingleton *o = TestTypeCppSingleton::instance(); |
| 394 | QQmlEngine::setObjectOwnership(o, QQmlEngine::CppOwnership); |
| 395 | return o; |
| 396 | } |
| 397 | |
| 398 | static QObject *create_singletonWithEnum(QQmlEngine *, QJSEngine *) |
| 399 | { |
| 400 | return new SingletonWithEnum; |
| 401 | } |
| 402 | |
| 403 | QObjectContainer::QObjectContainer() |
| 404 | : widgetParent(nullptr) |
| 405 | , gcOnAppend(false) |
| 406 | {} |
| 407 | |
| 408 | QQmlListProperty<QObject> QObjectContainer::data() |
| 409 | { |
| 410 | return QQmlListProperty<QObject>(this, nullptr, children_append, children_count, children_at, children_clear); |
| 411 | } |
| 412 | |
| 413 | void QObjectContainer::children_append(QQmlListProperty<QObject> *prop, QObject *o) |
| 414 | { |
| 415 | QObjectContainer *that = static_cast<QObjectContainer*>(prop->object); |
| 416 | that->dataChildren.append(t: o); |
| 417 | QObject::connect(sender: o, SIGNAL(destroyed(QObject*)), receiver: prop->object, SLOT(childDestroyed(QObject*))); |
| 418 | |
| 419 | if (that->gcOnAppend) { |
| 420 | QQmlEngine *engine = qmlEngine(that); |
| 421 | engine->collectGarbage(); |
| 422 | QCoreApplication::sendPostedEvents(receiver: nullptr, event_type: QEvent::DeferredDelete); |
| 423 | QCoreApplication::processEvents(); |
| 424 | } |
| 425 | } |
| 426 | |
| 427 | int QObjectContainer::children_count(QQmlListProperty<QObject> *prop) |
| 428 | { |
| 429 | return static_cast<QObjectContainer*>(prop->object)->dataChildren.count(); |
| 430 | } |
| 431 | |
| 432 | QObject *QObjectContainer::children_at(QQmlListProperty<QObject> *prop, int index) |
| 433 | { |
| 434 | return static_cast<QObjectContainer*>(prop->object)->dataChildren.at(i: index); |
| 435 | } |
| 436 | |
| 437 | void QObjectContainer::children_clear(QQmlListProperty<QObject> *prop) |
| 438 | { |
| 439 | QObjectContainer *that = static_cast<QObjectContainer*>(prop->object); |
| 440 | foreach (QObject *c, that->dataChildren) |
| 441 | QObject::disconnect(sender: c, SIGNAL(destroyed(QObject*)), receiver: that, SLOT(childDestroyed(QObject*))); |
| 442 | that->dataChildren.clear(); |
| 443 | } |
| 444 | |
| 445 | void QObjectContainer::childDestroyed(QObject *child) { |
| 446 | dataChildren.removeAll(t: child); |
| 447 | } |
| 448 | |
| 449 | void FloatingQObject::classBegin() |
| 450 | { |
| 451 | setParent(nullptr); |
| 452 | } |
| 453 | |
| 454 | void FloatingQObject::componentComplete() |
| 455 | { |
| 456 | Q_ASSERT(!parent()); |
| 457 | } |
| 458 | |
| 459 | void registerTypes() |
| 460 | { |
| 461 | qmlRegisterType<MyQmlObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyQmlObjectAlias" ); |
| 462 | qmlRegisterType<MyQmlObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyQmlObject" ); |
| 463 | qmlRegisterSingletonType<MyInheritedQmlObject>(uri: "Test" , versionMajor: 1, versionMinor: 0, typeName: "MyInheritedQmlObjectSingleton" , callback: inheritedQmlObject_provider); |
| 464 | qmlRegisterSingletonType<TestTypeCppSingleton>(uri: "Test" , versionMajor: 1, versionMinor: 0, typeName: "TestTypeCppSingleton" , callback: testTypeCppProvider); |
| 465 | qmlRegisterType<MyDeferredObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyDeferredObject" ); |
| 466 | qmlRegisterType<MyVeryDeferredObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyVeryDeferredObject" ); |
| 467 | qmlRegisterType<MyQmlContainer>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyQmlContainer" ); |
| 468 | qmlRegisterExtendedType<MyBaseExtendedObject, BaseExtensionObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyBaseExtendedObject" ); |
| 469 | qmlRegisterExtendedType<MyExtendedObject, ExtensionObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyExtendedObject" ); |
| 470 | qmlRegisterType<MyTypeObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyTypeObject" ); |
| 471 | qmlRegisterType<MyDerivedObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyDerivedObject" ); |
| 472 | qmlRegisterType<NumberAssignment>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "NumberAssignment" ); |
| 473 | qmlRegisterExtendedType<DefaultPropertyExtendedObject, DefaultPropertyExtensionObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "DefaultPropertyExtendedObject" ); |
| 474 | qmlRegisterType<OverrideDefaultPropertyObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "OverrideDefaultPropertyObject" ); |
| 475 | qmlRegisterType<MyRevisionedClass>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,qmlName: "MyRevisionedClass" ); |
| 476 | qmlRegisterType<MyDeleteObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyDeleteObject" ); |
| 477 | qmlRegisterType<MyRevisionedClass,1>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 1,qmlName: "MyRevisionedClass" ); |
| 478 | qmlRegisterType<MyWorkerObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyWorkerObject" ); |
| 479 | |
| 480 | qmlRegisterExtendedUncreatableType<AbstractExtensionObject, ExtensionObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "AbstractExtensionObject" , QStringLiteral("Abstracts are uncreatable" )); |
| 481 | qmlRegisterType<ImplementedExtensionObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "ImplementedExtensionObject" ); |
| 482 | |
| 483 | // test scarce resource property binding post-evaluation optimization |
| 484 | // and for testing memory usage in property var circular reference test |
| 485 | qmlRegisterType<ScarceResourceObject>(uri: "Qt.test" , versionMajor: 1,versionMinor: 0, qmlName: "MyScarceResourceObject" ); |
| 486 | |
| 487 | // Register the uncreatable base class |
| 488 | qmlRegisterRevision<MyRevisionedBaseClassRegistered,1>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 1); |
| 489 | // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0 |
| 490 | qmlRegisterType<MyRevisionedSubclass>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,qmlName: "MyRevisionedSubclass" ); |
| 491 | // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1 |
| 492 | qmlRegisterType<MyRevisionedSubclass,1>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 1,qmlName: "MyRevisionedSubclass" ); |
| 493 | qmlRegisterType<MyItemUsingRevisionedObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MyItemUsingRevisionedObject" ); |
| 494 | |
| 495 | #ifndef QT_NO_WIDGETS |
| 496 | qmlRegisterExtendedType<QWidget,QWidgetDeclarativeUI>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,qmlName: "QWidget" ); |
| 497 | qmlRegisterType<QPlainTextEdit>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,qmlName: "QPlainTextEdit" ); |
| 498 | #endif |
| 499 | |
| 500 | qRegisterMetaType<MyQmlObject::MyType>(typeName: "MyQmlObject::MyType" ); |
| 501 | |
| 502 | qmlRegisterSingletonType(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,typeName: "Script" ,callback: script_api); // register (script) singleton Type for an existing uri which contains elements |
| 503 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test" ,versionMajor: 1,versionMinor: 0,typeName: "QObject" ,callback: qobject_api); // register (qobject) for an existing uri for which another singleton Type was previously regd. Should replace! |
| 504 | qmlRegisterSingletonType(uri: "Qt.test.scriptApi" ,versionMajor: 1,versionMinor: 0,typeName: "Script" ,callback: script_api); // register (script) singleton Type for a uri which doesn't contain elements |
| 505 | qmlRegisterSingletonType(uri: "Qt.test.scriptApi" ,versionMajor: 2,versionMinor: 0,typeName: "Script" ,callback: readonly_script_api); // register (script) singleton Type for a uri which doesn't contain elements - will be made read-only |
| 506 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test.qobjectApi" ,versionMajor: 1,versionMinor: 0,typeName: "QObject" ,callback: qobject_api); // register (qobject) singleton Type for a uri which doesn't contain elements |
| 507 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test.qobjectApi" ,versionMajor: 1,versionMinor: 3,typeName: "QObject" ,callback: qobject_api); // register (qobject) singleton Type for a uri which doesn't contain elements, minor version set |
| 508 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test.qobjectApi" ,versionMajor: 2,versionMinor: 0,typeName: "QObject" ,callback: qobject_api); // register (qobject) singleton Type for a uri which doesn't contain elements, major version set |
| 509 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test.qobjectApiParented" ,versionMajor: 1,versionMinor: 0,typeName: "QObject" ,callback: qobject_api_engine_parent); // register (parented qobject) singleton Type for a uri which doesn't contain elements |
| 510 | |
| 511 | qmlRegisterSingletonType<testQObjectApi>(uri: "Qt.test.qobjectApis" ,versionMajor: 1,versionMinor: 0,typeName: "One" ,callback: qobject_api); // register multiple qobject singleton types in a single namespace |
| 512 | qmlRegisterSingletonType<testQObjectApiTwo>(uri: "Qt.test.qobjectApis" ,versionMajor: 1,versionMinor: 0,typeName: "Two" ,callback: qobject_api_two); // register multiple qobject singleton types in a single namespace |
| 513 | |
| 514 | qRegisterMetaType<MyQmlObject::MyEnum2>(typeName: "MyEnum2" ); |
| 515 | qRegisterMetaType<Qt::MouseButtons>(typeName: "Qt::MouseButtons" ); |
| 516 | |
| 517 | qmlRegisterType<CircularReferenceObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "CircularReferenceObject" ); |
| 518 | |
| 519 | qmlRegisterType<MyDynamicCreationDestructionObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MyDynamicCreationDestructionObject" ); |
| 520 | qmlRegisterType<WriteCounter>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "WriteCounter" ); |
| 521 | |
| 522 | qmlRegisterType<MySequenceConversionObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MySequenceConversionObject" ); |
| 523 | |
| 524 | qmlRegisterType<MyUnregisteredEnumTypeObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MyUnregisteredEnumTypeObject" ); |
| 525 | |
| 526 | qmlRegisterSingletonType<FallbackBindingsObject>(uri: "Qt.test.fallbackBindingsObject" , versionMajor: 1, versionMinor: 0, typeName: "Fallback" , callback: fallback_bindings_object); |
| 527 | qmlRegisterSingletonType<FallbackBindingsObject>(uri: "Qt.test.fallbackBindingsDerived" , versionMajor: 1, versionMinor: 0, typeName: "Fallback" , callback: fallback_bindings_derived); |
| 528 | |
| 529 | qmlRegisterType<FallbackBindingsObject>(uri: "Qt.test.fallbackBindingsItem" , versionMajor: 1, versionMinor: 0, qmlName: "FallbackBindingsType" ); |
| 530 | qmlRegisterType<FallbackBindingsDerived>(uri: "Qt.test.fallbackBindingsItem" , versionMajor: 1, versionMinor: 0, qmlName: "FallbackBindingsDerivedType" ); |
| 531 | |
| 532 | qmlRegisterType<FallbackBindingsTypeObject>(uri: "Qt.test.fallbackBindingsObject" , versionMajor: 1, versionMinor: 0, qmlName: "FallbackBindingsType" ); |
| 533 | qmlRegisterType<FallbackBindingsTypeDerived>(uri: "Qt.test.fallbackBindingsDerived" , versionMajor: 1, versionMinor: 0, qmlName: "FallbackBindingsType" ); |
| 534 | |
| 535 | qmlRegisterType<MyDateClass>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MyDateClass" ); |
| 536 | qmlRegisterType<MyStringClass>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MyStringClass" ); |
| 537 | qmlRegisterType<MiscTypeTestClass>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "MiscTypeTest" ); |
| 538 | |
| 539 | qmlRegisterSingletonType<testImportOrderApi>(uri: "Qt.test.importOrderApi" ,versionMajor: 1,versionMinor: 0,typeName: "Data" ,callback: testImportOrder_api); |
| 540 | qmlRegisterSingletonType<testImportOrderApi>(uri: "NamespaceAndType" ,versionMajor: 1,versionMinor: 0,typeName: "NamespaceAndType" ,callback: testImportOrder_api); |
| 541 | qmlRegisterSingletonType<testImportOrderApi>(uri: "Qt.test.importOrderApi1" ,versionMajor: 1,versionMinor: 0,typeName: "Data" ,callback: testImportOrder_api1); |
| 542 | qmlRegisterSingletonType<testImportOrderApi>(uri: "Qt.test.importOrderApi2" ,versionMajor: 1,versionMinor: 0,typeName: "Data" ,callback: testImportOrder_api2); |
| 543 | |
| 544 | qmlRegisterSingletonType<SingletonWithEnum>(uri: "Qt.test.singletonWithEnum" , versionMajor: 1, versionMinor: 0, typeName: "SingletonWithEnum" , callback: create_singletonWithEnum); |
| 545 | |
| 546 | qmlRegisterType<QObjectContainer>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "QObjectContainer" ); |
| 547 | qmlRegisterType<QObjectContainerWithGCOnAppend>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "QObjectContainerWithGCOnAppend" ); |
| 548 | qmlRegisterType<FloatingQObject>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "FloatingQObject" ); |
| 549 | |
| 550 | qmlRegisterType<ClashingNames>(uri: "Qt.test" , versionMajor: 1, versionMinor: 0, qmlName: "ClashingNames" ); |
| 551 | } |
| 552 | |
| 553 | #include "testtypes.moc" |
| 554 | |