Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqmltype.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmltype_p_p.h"
5
6#include <QtQml/qjsvalue.h>
7#include <QtQml/qqmlengine.h>
8#include <QtQml/qqmlcontext.h>
9#include <QtQml/qqmlcomponent.h>
10
11#include <private/qqmlcustomparser_p.h>
12#include <private/qqmldata_p.h>
13#include <private/qqmlmetatypedata_p.h>
14#include <private/qqmlpropertycache_p.h>
15#include <private/qqmltypedata_p.h>
16
18
20 : regType(type)
21{
22 switch (type) {
26 extraData.cppTypeData->newFunc = nullptr;
29 extraData.cppTypeData->extFunc = nullptr;
39 break;
46 break;
49 break;
52 break;
55 break;
58 break;
59 default: qFatal("QQmlTypePrivate Internal Error.");
60 }
61}
62
63QQmlTypePrivate::~QQmlTypePrivate()
64{
65 delete enums.fetchAndStoreAcquire(nullptr);
66 delete proxyMetaObjects.fetchAndStoreAcquire(nullptr);
67
68 if (const auto &iface = typeId.iface()) {
69 if (iface->metaObjectFn == &dynamicQmlMetaObject)
71 }
72
73 switch (regType) {
77 break;
82 break;
85 break;
88 break;
91 break;
92 default: //Also InterfaceType, because it has no extra data
93 break;
94 }
95}
96
97QQmlType::QQmlType() = default;
98QQmlType::QQmlType(const QQmlType &) = default;
99QQmlType::QQmlType(QQmlType &&) = default;
103QQmlType::~QQmlType() = default;
104
106{
107 if (!d)
108 return QHashedString();
109 return d->module;
110}
111
113{
114 if (!d)
115 return QTypeRevision();
116 return d->version;
117}
118
120{
121 if (!d)
122 return false;
123
125 return true;
126
128 return false;
129
131}
132
134{
135 if (!d || module != d->module)
136 return false;
137
139}
140
142{
144 if (!engine)
145 return QQmlType();
146 QQmlRefPointer<QQmlTypeData> td(engine->typeLoader.getType(sourceUrl()));
147 if (td.isNull() || !td->isComplete())
148 return QQmlType();
149 QV4::ExecutableCompilationUnit *compilationUnit = td->compilationUnit();
150 const QMetaObject *mo = compilationUnit->rootPropertyCache()->firstCppMetaObject();
152}
153
156{
157 // similar logic to resolveCompositeBaseType
159 if (!engine)
160 return nullptr;
161 QQmlRefPointer<QQmlTypeData> td(engine->typeLoader.getType(sourceUrl()));
162 if (td.isNull() || !td->isComplete())
163 return nullptr;
164 QV4::ExecutableCompilationUnit *compilationUnit = td->compilationUnit();
165 return compilationUnit->rootPropertyCache();
166}
167
168static bool isPropertyRevisioned(const QMetaObject *mo, int index)
169{
170 return mo->property(index).revision();
171}
172
174{
175 if (const ProxyMetaObjects *result = proxyMetaObjects.loadRelaxed())
176 return result;
177
178 ProxyMetaObjects *proxies = new ProxyMetaObjects;
179 auto finalize = [this, proxies]() -> const ProxyMetaObjects *{
180 const ProxyMetaObjects *concurrentModification;
181 if (proxyMetaObjects.testAndSetOrdered(nullptr, proxies, concurrentModification))
182 return proxies;
183
184 delete proxies;
185 return concurrentModification;
186 };
187
189 if (!mo) {
190 // version 0 singleton type without metaobject information
191 return finalize();
192 }
193
195
196 auto setupExtendedMetaObject = [&](const QMetaObject *extMetaObject,
197 QObject *(*extFunc)(QObject *)) {
198 if (!extMetaObject)
199 return;
200
201 // XXX - very inefficient
202 QMetaObjectBuilder builder;
203 QQmlMetaType::clone(builder, extMetaObject, extMetaObject, extMetaObject,
205 QMetaObject *mmo = builder.toMetaObject();
206 mmo->d.superdata = mo;
207 QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
208 metaObjects << data;
210 };
211
214 else if (regType == QQmlType::CppType)
216
218 mo, baseMetaObject, metaObjects.isEmpty() ? nullptr
219 : metaObjects.constLast().metaObject));
220
221 for (int ii = 0; ii < metaObjects.size(); ++ii) {
222 metaObjects[ii].propertyOffset =
223 metaObjects.at(ii).metaObject->propertyOffset();
224 metaObjects[ii].methodOffset =
225 metaObjects.at(ii).metaObject->methodOffset();
226 }
227
228 bool containsRevisionedAttributes = false;
229
230 // Check for revisioned details
231 {
232 const QMetaObject *mo = nullptr;
233 if (metaObjects.isEmpty())
235 else
236 mo = metaObjects.constFirst().metaObject;
237
238 for (int ii = 0; !containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
239 if (isPropertyRevisioned(mo, ii))
240 containsRevisionedAttributes = true;
241 }
242
243 for (int ii = 0; !containsRevisionedAttributes && ii < mo->methodCount(); ++ii) {
244 if (mo->method(ii).revision() != 0)
245 containsRevisionedAttributes = true;
246 }
247 }
248
249 proxies->data = std::move(metaObjects);
250 proxies->containsRevisionedAttributes = containsRevisionedAttributes;
251
252 return finalize();
253}
254
256{
257 if (const Enums *result = enums.loadRelaxed())
258 return result;
259
260 Enums *newEnums = new Enums;
261
262 // beware: It could be a singleton type without metaobject
263
268 }
269
270 if (baseMetaObject) {
271 // init() can add to the metaObjects list. Therefore, check proxies->data only below
272 const ProxyMetaObjects *proxies = init();
274 newEnums,
275 proxies->data.isEmpty() ? baseMetaObject : proxies->data.constFirst().metaObject);
276 }
277
278 const Enums *concurrentModification;
279 if (enums.testAndSetOrdered(nullptr, newEnums, concurrentModification))
280 return newEnums;
281
282 delete newEnums;
283 return concurrentModification;
284}
285
287{
288 // Add any enum values defined by 'related' classes
290 if (const auto *related = metaObject->d.relatedMetaObjects) {
291 while (const QMetaObject *relatedMetaObject = *related) {
292 insertEnums(enums, relatedMetaObject);
293 ++related;
294 }
295 }
296 }
297
298 QSet<QString> localEnums;
299 const QMetaObject *localMetaObject = nullptr;
300
301 // Add any enum values defined by this class, overwriting any inherited values
302 for (int ii = 0; ii < metaObject->enumeratorCount(); ++ii) {
303 QMetaEnum e = metaObject->enumerator(ii);
304 const bool isScoped = e.isScoped();
305 QStringHash<int> *scoped = isScoped ? new QStringHash<int>() : nullptr;
306
307 // We allow enums in sub-classes to overwrite enums from base-classes, such as
308 // ListView.Center (from enum PositionMode) overwriting Item.Center (from enum TransformOrigin).
309 // This is acceptable because the _use_ of the enum from the QML side requires qualification
310 // anyway, i.e. ListView.Center vs. Item.Center.
311 // However if a class defines two enums with the same value, then that must produce a warning
312 // because it represents a valid conflict.
313 if (e.enclosingMetaObject() != localMetaObject) {
314 localEnums.clear();
315 localMetaObject = e.enclosingMetaObject();
316 }
317
318 for (int jj = 0; jj < e.keyCount(); ++jj) {
319 const QString key = QString::fromUtf8(e.key(jj));
320 const int value = e.value(jj);
321 if (!isScoped || (regType == QQmlType::CppType
323 if (localEnums.contains(key)) {
324 auto existingEntry = enums->enums.find(key);
325 if (existingEntry != enums->enums.end() && existingEntry.value() != value) {
326 qWarning("Previously registered enum will be overwritten due to name clash: %s.%s", metaObject->className(), key.toUtf8().constData());
327 createEnumConflictReport(metaObject, key);
328 }
329 } else {
330 localEnums.insert(key);
331 }
332 enums->enums.insert(key, value);
333 }
334 if (isScoped)
335 scoped->insert(key, value);
336 }
337
338 if (isScoped) {
339 enums->scopedEnums << scoped;
340 enums->scopedEnumIndex.insert(QString::fromUtf8(e.name()), enums->scopedEnums.size()-1);
341 }
342 }
343}
344
345void QQmlTypePrivate::createListOfPossibleConflictingItems(const QMetaObject *metaObject, QList<EnumInfo> &enumInfoList, QStringList path) const
346{
347 path.append(QString::fromUtf8(metaObject->className()));
348
349 if (metaObject->d.relatedMetaObjects) {
350 const auto *related = metaObject->d.relatedMetaObjects;
351 if (related) {
352 while (*related)
353 createListOfPossibleConflictingItems(*related++, enumInfoList, path);
354 }
355 }
356
357 for (int ii = 0; ii < metaObject->enumeratorCount(); ++ii) {
358 const auto e = metaObject->enumerator(ii);
359
360 for (int jj = 0; jj < e.keyCount(); ++jj) {
361 const QString key = QString::fromUtf8(e.key(jj));
362
363 EnumInfo enumInfo;
364 enumInfo.metaObjectName = QString::fromUtf8(metaObject->className());
365 enumInfo.enumName = QString::fromUtf8(e.name());
366 enumInfo.enumKey = key;
367 enumInfo.scoped = e.isScoped();
368 enumInfo.path = path;
369 enumInfo.metaEnumScope = QString::fromUtf8(e.scope());
370 enumInfoList.append(enumInfo);
371 }
372 }
373}
374
375void QQmlTypePrivate::createEnumConflictReport(const QMetaObject *metaObject, const QString &conflictingKey) const
376{
377 QList<EnumInfo> enumInfoList;
378
379 if (baseMetaObject) // prefer baseMetaObject if available
381
382 if (!metaObject) { // If there is no metaObject at all return early
383 qWarning() << "No meta object information available. Skipping conflict analysis.";
384 return;
385 }
386
387 createListOfPossibleConflictingItems(metaObject, enumInfoList, QStringList());
388
389 qWarning().noquote() << QLatin1String("Possible conflicting items:");
390 // find items with conflicting key
391 for (const auto &i : std::as_const(enumInfoList)) {
392 if (i.enumKey == conflictingKey)
393 qWarning().noquote().nospace() << " " << i.metaObjectName << "." << i.enumName << "." << i.enumKey << " from scope "
394 << i.metaEnumScope << " injected by " << i.path.join(QLatin1String("->"));
395 }
396}
397
399 Enums *enums, const QQmlPropertyCache::ConstPtr &cache) const
400{
401 const QMetaObject *cppMetaObject = cache->firstCppMetaObject();
402
403 for (const QQmlPropertyCache *currentCache = cache.data();
404 currentCache && currentCache->metaObject() != cppMetaObject;
405 currentCache = currentCache->parent().data()) {
406
407 int count = currentCache->qmlEnumCount();
408 for (int ii = 0; ii < count; ++ii) {
409 QStringHash<int> *scoped = new QStringHash<int>();
410 QQmlEnumData *enumData = currentCache->qmlEnum(ii);
411
412 for (int jj = 0; jj < enumData->values.size(); ++jj) {
413 const QQmlEnumValue &value = enumData->values.at(jj);
414 enums->enums.insert(value.namedValue, value.value);
415 scoped->insert(value.namedValue, value.value);
416 }
417 enums->scopedEnums << scoped;
418 enums->scopedEnumIndex.insert(enumData->name, enums->scopedEnums.size()-1);
419 }
420 }
421 insertEnums(enums, cppMetaObject);
422}
423
424void QQmlTypePrivate::setName(const QString &uri, const QString &element)
425{
426 module = uri;
427 elementName = element;
428 name = uri.isEmpty() ? element : (uri + QLatin1Char('/') + element);
429}
430
432{
433 if (d) {
436 else if (d->baseMetaObject)
437 return d->baseMetaObject->className();
438 }
439 return QByteArray();
440}
441
443{
444 if (!d)
445 return QString();
446 return d->elementName;
447}
448
450{
451 if (!d)
452 return QString();
453 return d->name;
454}
455
463{
464 void *unused;
465 return create(&unused, 0);
466}
467
480QObject *QQmlType::create(void **memory, size_t additionalMemory) const
481{
482 if (!d || !isCreatable())
483 return nullptr;
484
485 QObject *rv = (QObject *)operator new(d->extraData.cppTypeData->allocationSize + additionalMemory);
487
488 createProxy(rv);
489 *memory = ((char *)rv) + d->extraData.cppTypeData->allocationSize;
490 return rv;
491}
492
499{
500 void *ddataMemory = nullptr;
501 auto instance = create(&ddataMemory, sizeof(QQmlData));
502 if (!instance)
503 return nullptr;
505 Q_ASSERT(!p->isDeletingChildren);
506 if (!p->declarativeData)
507 p->declarativeData = new (ddataMemory) QQmlData(QQmlData::DoesNotOwnMemory);
508 return instance;
509}
510
512{
513 if (!d)
514 return nullptr;
516 return nullptr;
518}
519
521{
522 if (!d)
523 return nullptr;
524 if (d->regType != CppType)
525 return nullptr;
527}
528
530{
531 if (!d || d->regType != CppType)
532 return nullptr;
534}
535
537{
538 if (!d || d->regType != CppType)
539 return false;
541}
542
544{
545 if (!d || d->regType != CppType)
546 return false;
548}
549
551{
552 if (!d || d->regType != CppType)
553 return nullptr;
554 return d->extraData.cppTypeData->newFunc;
555}
556
558{
559 if (!d || d->regType != CppType)
560 return QString();
562}
563
565{
566 return d && d->regType == CppType && d->extraData.cppTypeData->newFunc;
567}
568
570{
571 if (!d)
572 return nullptr;
573
574 switch (d->regType) {
575 case CppType:
576 return d->extraData.cppTypeData->extFunc;
577 case SingletonType:
579 default:
580 return nullptr;
581 }
582}
583
585{
586 if (!d)
587 return nullptr;
588
589 switch (d->regType) {
590 case CppType:
592 case SingletonType:
594 default:
595 return nullptr;
596 }
597}
598
600{
601 return d && !d->init()->data.isEmpty();
602}
603
605{
606 return d && (d->regType == SingletonType || d->regType == CompositeSingletonType);
607}
608
610{
611 return d && d->regType == InterfaceType;
612}
613
615{
616 return d && d->isComposite();
617}
618
620{
621 // if the outer type is a composite singleton, d->regType will indicate that even for
622 // the inline component type
623 // however, inline components can -at least for now- never be singletons
624 // so we just do one additional check
626}
627
629{
631}
632
634{
636}
637
639{
640 return d && d->regType == SequentialContainerType;
641}
642
644{
645 return d ? d->typeId : QMetaType{};
646}
647
649{
650 return d ? d->listId : QMetaType{};
651}
652
654{
656}
657
659{
660 if (!d)
661 return nullptr;
662 const QQmlTypePrivate::ProxyMetaObjects *proxies = d->init();
663
664 if (proxies->data.isEmpty())
665 return d->baseMetaObject;
666 else
667 return proxies->data.constFirst().metaObject;
668}
669
671{
672 return d ? d->baseMetaObject : nullptr;
673}
674
676{
677 return d && d->init()->containsRevisionedAttributes;
678}
679
681{
682 return d ? d->revision : QTypeRevision();
683}
684
686{
687 if (const QQmlTypePrivate *base = d ? d->attachedPropertiesBase(engine) : nullptr)
688 return base->extraData.cppTypeData->attachedPropertiesFunc;
689 return nullptr;
690}
691
693{
694 if (const QQmlTypePrivate *base = d ? d->attachedPropertiesBase(engine) : nullptr)
695 return base->extraData.cppTypeData->attachedPropertiesType;
696 return nullptr;
697}
698
700{
701 if (!d || d->regType != CppType)
702 return -1;
704}
705
707{
708 if (!d || d->regType != CppType)
709 return -1;
711}
712
714{
715 if (!d || d->regType != CppType)
716 return -1;
718}
719
721{
722 if (!d || d->regType != CppType)
723 return -1;
725}
726
727const char *QQmlType::interfaceIId() const
728{
729 if (!d || d->regType != InterfaceType)
730 return nullptr;
732}
733
735{
736 return d ? d->index : -1;
737}
738
740 return d ? d->regType == QQmlType::InlineComponentType : false;
741}
742
744{
745 return d ? d->sourceUrl() : QUrl();
746}
747
749{
750 Q_ASSERT(ok);
751 if (d) {
752 *ok = true;
753
754 if (int *rv = d->initEnums(engine)->enums.value(name))
755 return *rv;
756 }
757
758 *ok = false;
759 return -1;
760}
761
763{
764 Q_ASSERT(ok);
765 if (d) {
766 *ok = true;
767
768 if (int *rv = d->initEnums(engine)->enums.value(name))
769 return *rv;
770 }
771
772 *ok = false;
773 return -1;
774}
775
777{
778 Q_ASSERT(ok);
779 if (d) {
780 *ok = true;
781
782 if (int *rv = d->initEnums(engine)->enums.value(name))
783 return *rv;
784 }
785
786 *ok = false;
787 return -1;
788}
789
791{
792 Q_ASSERT(ok);
793 if (d) {
794 *ok = true;
795
796 if (int *rv = d->initEnums(engine)->scopedEnumIndex.value(name))
797 return *rv;
798 }
799
800 *ok = false;
801 return -1;
802}
803
805{
806 Q_ASSERT(ok);
807 if (d) {
808 *ok = true;
809
810 if (int *rv = d->initEnums(engine)->scopedEnumIndex.value(name))
811 return *rv;
812 }
813
814 *ok = false;
815 return -1;
816}
817
819{
820 Q_ASSERT(ok);
821 *ok = true;
822
823 if (d) {
824 const QQmlTypePrivate::Enums *enums = d->initEnums(engine);
825 Q_ASSERT(index > -1 && index < enums->scopedEnums.size());
826 if (int *rv = enums->scopedEnums.at(index)->value(name))
827 return *rv;
828 }
829
830 *ok = false;
831 return -1;
832}
833
835{
836 Q_ASSERT(ok);
837 *ok = true;
838
839 if (d) {
840 const QQmlTypePrivate::Enums *enums = d->initEnums(engine);
841 Q_ASSERT(index > -1 && index < enums->scopedEnums.size());
842 if (int *rv = enums->scopedEnums.at(index)->value(name))
843 return *rv;
844 }
845
846 *ok = false;
847 return -1;
848}
849
850int QQmlType::scopedEnumValue(QQmlEnginePrivate *engine, const QByteArray &scopedEnumName, const QByteArray &name, bool *ok) const
851{
852 Q_ASSERT(ok);
853 if (d) {
854 *ok = true;
855
856 const QQmlTypePrivate::Enums *enums = d->initEnums(engine);
857
858 if (int *rv = enums->scopedEnumIndex.value(
859 QHashedCStringRef(scopedEnumName.constData(), scopedEnumName.size()))) {
860 const int index = *rv;
861 Q_ASSERT(index > -1 && index < enums->scopedEnums.size());
862 rv = enums->scopedEnums.at(index)->value(
863 QHashedCStringRef(name.constData(), name.size()));
864 if (rv)
865 return *rv;
866 }
867 }
868
869 *ok = false;
870 return -1;
871}
872
874{
875 Q_ASSERT(ok);
876 if (d) {
877 *ok = true;
878
879 const QQmlTypePrivate::Enums *enums = d->initEnums(engine);
880
881 if (int *rv = enums->scopedEnumIndex.value(QHashedStringRef(scopedEnumName))) {
882 const int index = *rv;
883 Q_ASSERT(index > -1 && index < enums->scopedEnums.size());
885 if (rv)
886 return *rv;
887 }
888 }
889
890 *ok = false;
891 return -1;
892}
893
895{
896 if (priv)
897 priv->addref();
898}
899
901{
902 if (priv)
903 priv->release();
904}
905
907{
908 if (priv)
909 return priv->count();
910 return -1;
911}
912
913void QQmlType::createProxy(QObject *instance) const
914{
915 const QQmlTypePrivate::ProxyMetaObjects *proxies = d->init();
916 if (!proxies->data.isEmpty())
917 (void)new QQmlProxyMetaObject(instance, &proxies->data);
918}
919
\inmodule QtCore
Definition qbytearray.h:57
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
Definition qbytearray.h:474
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:122
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
bool isEmpty() const noexcept
Definition qlist.h:390
const T & constLast() const noexcept
Definition qlist.h:633
const_reference at(qsizetype i) const noexcept
Definition qlist.h:429
const T & constFirst() const noexcept
Definition qlist.h:630
void append(parameter_type t)
Definition qlist.h:441
\inmodule QtCore
QMetaObject * toMetaObject() const
Converts this meta object builder into a concrete QMetaObject.
\inmodule QtCore
\inmodule QtCore
Definition qmetatype.h:320
const QtPrivate::QMetaTypeInterface * iface() const
Definition qmetatype.h:750
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:153
\inmodule QtCore
Definition qobject.h:90
The QQmlCustomParser class allows you to add new arbitrary types to QML.
@ DoesNotOwnMemory
Definition qqmldata_p.h:58
static QList< QQmlProxyMetaObject::ProxyData > proxyData(const QMetaObject *mo, const QMetaObject *baseMetaObject, QMetaObject *lastMetaObject)
static void clone(QMetaObjectBuilder &builder, const QMetaObject *mo, const QMetaObject *ignoreStart, const QMetaObject *ignoreEnd, ClonePolicy policy)
static QQmlType qmlType(const QString &qualifiedName, QTypeRevision version)
Returns the type (if any) of URI-qualified named qualifiedName and version specified by version_major...
static void registerMetaObjectForType(const QMetaObject *metaobject, QQmlTypePrivate *type)
static void unregisterInternalCompositeType(QMetaType metaType, QMetaType listMetaType)
void addref() const
int count() const
void release() const
bool isNull() const
void setName(const QString &uri, const QString &element)
Definition qqmltype.cpp:424
const ProxyMetaObjects * init() const
Definition qqmltype.cpp:173
QTypeRevision revision
QQmlPropertyCache::ConstPtr compositePropertyCache(QQmlEnginePrivate *engine) const
Definition qqmltype.cpp:154
union QQmlTypePrivate::extraData extraData
const QQmlTypePrivate * attachedPropertiesBase(QQmlEnginePrivate *engine) const
const Enums * initEnums(QQmlEnginePrivate *engine) const
Definition qqmltype.cpp:255
bool isComposite() const
QTypeRevision version
QUrl sourceUrl() const
void insertEnumsFromPropertyCache(Enums *enums, const QQmlPropertyCache::ConstPtr &cache) const
Definition qqmltype.cpp:398
QQmlTypePrivate(QQmlType::RegistrationType type)
Definition qqmltype.cpp:19
QQmlType::RegistrationType regType
const QMetaObject * baseMetaObject
void insertEnums(Enums *enums, const QMetaObject *metaObject) const
Definition qqmltype.cpp:286
QQmlType resolveCompositeBaseType(QQmlEnginePrivate *engine) const
Definition qqmltype.cpp:141
QHashedString module
bool isCreatable() const
Definition qqmltype.cpp:564
SingletonInstanceInfo * singletonInstanceInfo() const
Definition qqmltype.cpp:511
int propertyValueSourceCast() const
Definition qqmltype.cpp:706
bool isCompositeSingleton() const
Definition qqmltype.cpp:619
bool availableInVersion(QTypeRevision version) const
Definition qqmltype.cpp:119
@ InlineComponentType
Definition qqmltype_p.h:156
@ SingletonType
Definition qqmltype_p.h:152
@ SequentialContainerType
Definition qqmltype_p.h:157
@ CompositeType
Definition qqmltype_p.h:154
@ CompositeSingletonType
Definition qqmltype_p.h:155
@ InterfaceType
Definition qqmltype_p.h:153
int propertyValueInterceptorCast() const
Definition qqmltype.cpp:713
bool canPopulateValueType() const
Definition qqmltype.cpp:543
const char * interfaceIId() const
Definition qqmltype.cpp:727
QTypeRevision version() const
Definition qqmltype.cpp:112
bool isQObjectSingleton() const
Definition qqmltype.cpp:628
QQmlAttachedPropertiesFunc attachedPropertiesFunction(QQmlEnginePrivate *engine) const
Definition qqmltype.cpp:685
QString noCreationReason() const
Definition qqmltype.cpp:557
QMetaType typeId() const
Definition qqmltype.cpp:643
bool isSequentialContainer() const
Definition qqmltype.cpp:638
const QMetaObject * attachedPropertiesType(QQmlEnginePrivate *engine) const
Definition qqmltype.cpp:692
QMetaSequence listMetaSequence() const
Definition qqmltype.cpp:653
QString qmlTypeName() const
Definition qqmltype.cpp:449
int index() const
Definition qqmltype.cpp:734
CreateValueTypeFunc createValueTypeFunction() const
Definition qqmltype.cpp:529
QMetaType qListTypeId() const
Definition qqmltype.cpp:648
CreateFunc createFunction() const
Definition qqmltype.cpp:550
QHashedString module() const
Definition qqmltype.cpp:105
int scopedEnumIndex(QQmlEnginePrivate *engine, const QV4::String *, bool *ok) const
Definition qqmltype.cpp:790
QObject * createWithQQmlData() const
Definition qqmltype.cpp:498
void createProxy(QObject *instance) const
Definition qqmltype.cpp:913
QByteArray typeName() const
Definition qqmltype.cpp:431
static int refCount(const QQmlTypePrivate *priv)
Definition qqmltype.cpp:906
bool canConstructValueType() const
Definition qqmltype.cpp:536
const QMetaObject * baseMetaObject() const
Definition qqmltype.cpp:670
QVariant(* CreateValueTypeFunc)(const QJSValue &)
Definition qqmltype_p.h:70
QUrl sourceUrl() const
Definition qqmltype.cpp:743
const QQmlTypePrivate * priv() const
Definition qqmltype_p.h:145
ExtensionFunc extensionFunction() const
Definition qqmltype.cpp:569
bool isInterface() const
Definition qqmltype.cpp:609
bool isQJSValueSingleton() const
Definition qqmltype.cpp:633
const QMetaObject * metaObject() const
Definition qqmltype.cpp:658
QObject * create() const
Definition qqmltype.cpp:462
static void refHandle(const QQmlTypePrivate *priv)
Definition qqmltype.cpp:894
int enumValue(QQmlEnginePrivate *engine, const QHashedStringRef &, bool *ok) const
Definition qqmltype.cpp:748
static void derefHandle(const QQmlTypePrivate *priv)
Definition qqmltype.cpp:900
QQmlCustomParser * customParser() const
Definition qqmltype.cpp:520
QQmlType & operator=(const QQmlType &other)
bool isComposite() const
Definition qqmltype.cpp:614
QObject *(* ExtensionFunc)(QObject *)
Definition qqmltype_p.h:86
bool isExtendedType() const
Definition qqmltype.cpp:599
const QMetaObject * extensionMetaObject() const
Definition qqmltype.cpp:584
int finalizerCast() const
Definition qqmltype.cpp:720
QTypeRevision metaObjectRevision() const
Definition qqmltype.cpp:680
bool isInlineComponentType() const
Definition qqmltype.cpp:739
QString elementName() const
Definition qqmltype.cpp:442
bool containsRevisionedAttributes() const
Definition qqmltype.cpp:675
int parserStatusCast() const
Definition qqmltype.cpp:699
void(* CreateFunc)(void *, void *)
Definition qqmltype_p.h:80
int scopedEnumValue(QQmlEnginePrivate *engine, int index, const QV4::String *, bool *ok) const
Definition qqmltype.cpp:818
bool isSingleton() const
Definition qqmltype.cpp:604
Definition qset.h:18
void clear()
Definition qset.h:61
bool contains(const T &value) const
Definition qset.h:71
iterator insert(const T &value)
Definition qset.h:155
MutableIterator find(const K &)
void insert(const K &, const T &)
T * value(const K &) const
MutableIterator end()
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
QByteArray toUtf8() const &
Definition qstring.h:563
\inmodule QtCore
constexpr bool hasMinorVersion() const
Returns true if the minor version is known, otherwise false.
constexpr bool hasMajorVersion() const
Returns true if the major version is known, otherwise false.
constexpr quint8 minorVersion() const
Returns the minor version encoded in the revision.
constexpr quint8 majorVersion() const
Returns the major version encoded in the revision.
\inmodule QtCore
Definition qurl.h:94
~QUrl()
Destructor; called immediately before the object is deleted.
Definition qurl.cpp:1859
QQmlPropertyCache::ConstPtr rootPropertyCache() const
double e
QCache< int, Employee > cache
[0]
auto mo
[7]
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qWarning
Definition qlogging.h:162
#define qFatal
Definition qlogging.h:164
static const QMetaObjectPrivate * priv(const uint *data)
GLuint64 key
GLuint index
[2]
GLenum GLenum GLsizei count
GLenum type
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint name
GLsizei GLenum GLsizei GLsizei GLuint memory
GLsizei const GLchar *const * path
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
const QMetaObject * dynamicQmlMetaObject(const QtPrivate::QMetaTypeInterface *iface)
QQmlPrivate::QQmlAttachedPropertiesFunc< QObject > QQmlAttachedPropertiesFunc
Definition qqmlprivate.h:62
static bool isPropertyRevisioned(const QMetaObject *mo, int index)
Definition qqmltype.cpp:168
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
obj metaObject() -> className()
QSharedPointer< T > other(t)
[5]
QJSEngine engine
[0]
\inmodule QtCore \reentrant
Definition qchar.h:17
SuperData superdata
\inmodule QtCore
const char * className() const
Returns the class name.
struct QMetaObject::Data d
QVector< QQmlEnumValue > values
QStringHash< int > enums
QList< QStringHash< int > * > scopedEnums
QStringHash< int > scopedEnumIndex
QList< QQmlProxyMetaObject::ProxyData > data
const QMetaObject * attachedPropertiesType
QQmlAttachedPropertiesFunc attachedPropertiesFunc
const QMetaObject * extMetaObject
QObject *(* extFunc)(QObject *)
void(* newFunc)(void *, void *)
QVariant(* createValueTypeFunc)(const QJSValue &)
QQmlType::SingletonInstanceInfo * singletonInstanceInfo
std::function< QObject *(QQmlEngine *, QJSEngine *)> qobjectCallback
Definition qqmltype_p.h:125
std::function< QJSValue(QQmlEngine *, QJSEngine *)> scriptCallback
Definition qqmltype_p.h:124
QQmlSingletonTypeData * singletonTypeData
QMetaSequence sequentialContainerTypeData
QQmlCppTypeData * cppTypeData