7#include <QtQml/qjsvalue.h>
8#include <QtQml/qqmlengine.h>
9#include <QtQml/qqmlcontext.h>
10#include <QtQml/qqmlcomponent.h>
12#include <private/qqmlcustomparser_p.h>
13#include <private/qqmldata_p.h>
14#include <private/qqmlmetatypedata_p.h>
15#include <private/qqmlpropertycache_p.h>
16#include <private/qqmltypedata_p.h>
20QQmlTypePrivate::QQmlTypePrivate(QQmlType::RegistrationType type)
24 case QQmlType::CppType:
25 extraData.cppTypeData =
new QQmlCppTypeData;
26 extraData.cppTypeData->allocationSize = 0;
27 extraData.cppTypeData->newFunc =
nullptr;
28 extraData.cppTypeData->createValueTypeFunc =
nullptr;
29 extraData.cppTypeData->parserStatusCast = -1;
30 extraData.cppTypeData->extFunc =
nullptr;
31 extraData.cppTypeData->extMetaObject =
nullptr;
32 extraData.cppTypeData->customParser =
nullptr;
33 extraData.cppTypeData->attachedPropertiesFunc =
nullptr;
34 extraData.cppTypeData->attachedPropertiesType =
nullptr;
35 extraData.cppTypeData->propertyValueSourceCast = -1;
36 extraData.cppTypeData->propertyValueInterceptorCast = -1;
37 extraData.cppTypeData->finalizerCast = -1;
38 extraData.cppTypeData->registerEnumClassesUnscoped =
true;
39 extraData.cppTypeData->registerEnumsFromRelatedTypes =
true;
41 case QQmlType::SingletonType:
42 case QQmlType::CompositeSingletonType:
43 extraData.singletonTypeData =
new QQmlSingletonTypeData;
44 extraData.singletonTypeData->singletonInstanceInfo =
nullptr;
45 extraData.singletonTypeData->extFunc =
nullptr;
46 extraData.singletonTypeData->extMetaObject =
nullptr;
48 case QQmlType::InterfaceType:
49 extraData.interfaceTypeData =
nullptr;
51 case QQmlType::CompositeType:
52 new (&extraData.compositeTypeData) QUrl();
54 case QQmlType::InlineComponentType:
55 new (&extraData.inlineComponentTypeData) QUrl();
57 case QQmlType::SequentialContainerType:
58 new (&extraData.sequentialContainerTypeData) QMetaSequence();
60 case QQmlType::JavaScriptType:
61 new (&extraData.javaScriptTypeData) QUrl();
63 default: qFatal(
"QQmlTypePrivate Internal Error.");
67QQmlTypePrivate::~QQmlTypePrivate()
69 delete enums.fetchAndStoreAcquire(
nullptr);
70 delete proxyMetaObjects.fetchAndStoreAcquire(
nullptr);
73 case QQmlType::CppType:
74 delete extraData.cppTypeData->customParser;
75 delete extraData.cppTypeData;
77 case QQmlType::SingletonType:
78 case QQmlType::CompositeSingletonType:
79 extraData.singletonTypeData->singletonInstanceInfo.reset();
80 delete extraData.singletonTypeData;
82 case QQmlType::CompositeType:
83 extraData.compositeTypeData.~QUrl();
85 case QQmlType::InlineComponentType:
86 extraData.inlineComponentTypeData.~QUrl();
88 case QQmlType::SequentialContainerType:
89 extraData.sequentialContainerTypeData.~QMetaSequence();
91 case QQmlType::JavaScriptType:
92 extraData.javaScriptTypeData.~QUrl();
99QQmlType::QQmlType() =
default;
100QQmlType::QQmlType(
const QQmlType &) =
default;
101QQmlType::QQmlType(QQmlType &&) =
default;
102QQmlType &QQmlType::operator =(
const QQmlType &other) =
default;
103QQmlType &QQmlType::operator =(QQmlType &&other) =
default;
104QQmlType::QQmlType(
const QQmlTypePrivate *priv) : d(priv) {}
105QQmlType::~QQmlType() =
default;
107QHashedString QQmlType::module()
const
110 return QHashedString();
114QTypeRevision QQmlType::version()
const
117 return QTypeRevision();
121bool QQmlType::availableInVersion(QTypeRevision version)
const
126 if (!version.hasMajorVersion())
129 if (version.majorVersion() != d->version.majorVersion())
132 return !version.hasMinorVersion() || version.minorVersion() >= d->version.minorVersion();
135bool QQmlType::availableInVersion(
const QHashedStringRef &module, QTypeRevision version)
const
137 if (!d || module != d->module)
140 return availableInVersion(version);
143QQmlType QQmlTypePrivate::resolveCompositeBaseType(QQmlTypeLoader *typeLoader)
const
145 Q_ASSERT(isComposite());
148 QQmlRefPointer<QQmlTypeData> td(typeLoader->getType(sourceUrl()));
149 if (td.isNull() || !td->isComplete())
151 QV4::CompiledData::CompilationUnit *compilationUnit = td->compilationUnit();
152 if (
const auto cache = compilationUnit->rootPropertyCache())
153 return QQmlMetaType::qmlType(cache->firstCppMetaObject());
157QQmlPropertyCache::ConstPtr QQmlTypePrivate::compositePropertyCache(
158 QQmlTypeLoader *typeLoader)
const
161 Q_ASSERT(isComposite());
164 QQmlRefPointer<QQmlTypeData> td(typeLoader->getType(sourceUrl()));
165 if (td.isNull() || !td->isComplete())
167 QV4::CompiledData::CompilationUnit *compilationUnit = td->compilationUnit();
168 return compilationUnit->rootPropertyCache();
173 return mo->property(index).revision();
176const QQmlTypePrivate::ProxyMetaObjects *QQmlTypePrivate::init()
const
178 if (
const ProxyMetaObjects *result = proxyMetaObjects.loadRelaxed())
181 ProxyMetaObjects *proxies =
new ProxyMetaObjects;
182 auto finalize = [
this, proxies]() ->
const ProxyMetaObjects *{
183 const ProxyMetaObjects *concurrentModification;
184 if (proxyMetaObjects.testAndSetOrdered(
nullptr, proxies, concurrentModification))
188 return concurrentModification;
191 const QMetaObject *mo = baseMetaObject;
197 QList<QQmlProxyMetaObject::ProxyData> metaObjects;
199 auto setupExtendedMetaObject = [&](
const QMetaObject *extMetaObject,
200 QObject *(*extFunc)(QObject *)) {
205 QMetaObjectBuilder builder;
206 QQmlMetaType::clone(builder, extMetaObject, extMetaObject, extMetaObject,
207 extFunc ? QQmlMetaType::CloneAll : QQmlMetaType::CloneEnumsOnly);
208 QMetaObject *mmo = builder.toMetaObject();
209 mmo->d.superdata = mo;
210 QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
212 QQmlMetaType::registerMetaObjectForType(mmo,
this);
215 if (regType == QQmlType::SingletonType)
216 setupExtendedMetaObject(extraData.singletonTypeData->extMetaObject, extraData.singletonTypeData->extFunc);
217 else if (regType == QQmlType::CppType)
218 setupExtendedMetaObject(extraData.cppTypeData->extMetaObject, extraData.cppTypeData->extFunc);
220 metaObjects.append(QQmlMetaType::proxyData(
221 mo, baseMetaObject, metaObjects.isEmpty() ?
nullptr
222 : metaObjects.constLast().metaObject));
224 for (
int ii = 0; ii < metaObjects.size(); ++ii) {
225 metaObjects[ii].propertyOffset =
226 metaObjects.at(ii).metaObject->propertyOffset();
227 metaObjects[ii].methodOffset =
228 metaObjects.at(ii).metaObject->methodOffset();
231 bool containsRevisionedAttributes =
false;
235 const QMetaObject *mo =
nullptr;
236 if (metaObjects.isEmpty())
239 mo = metaObjects.constFirst().metaObject;
241 for (
int ii = 0; !containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
242 if (isPropertyRevisioned(mo, ii))
243 containsRevisionedAttributes =
true;
246 for (
int ii = 0; !containsRevisionedAttributes && ii < mo->methodCount(); ++ii) {
247 if (mo->method(ii).revision() != 0)
248 containsRevisionedAttributes =
true;
252 proxies->data = std::move(metaObjects);
253 proxies->containsRevisionedAttributes = containsRevisionedAttributes;
258const QQmlTypePrivate::Enums *QQmlTypePrivate::initEnums(QQmlTypeLoader *typeLoader)
const
260 if (
const Enums *result = enums.loadRelaxed())
263 QQmlPropertyCache::ConstPtr cache;
265 cache = compositePropertyCache(typeLoader);
270 Enums *newEnums =
new Enums;
275 insertEnumsFromPropertyCache(newEnums, cache);
277 if (baseMetaObject) {
279 const ProxyMetaObjects *proxies = init();
282 proxies->data.isEmpty() ? baseMetaObject : proxies->data.constFirst().metaObject);
285 const Enums *concurrentModification;
286 if (enums.testAndSetOrdered(
nullptr, newEnums, concurrentModification))
290 return concurrentModification;
293void QQmlTypePrivate::insertEnums(Enums *enums,
const QMetaObject *metaObject)
const
296 if (regType != QQmlType::CppType || extraData.cppTypeData->registerEnumsFromRelatedTypes) {
297 if (
const auto *related = metaObject->d.relatedMetaObjects) {
298 while (
const QMetaObject *relatedMetaObject = *related) {
299 insertEnums(enums, relatedMetaObject);
305 QSet<QString> localEnums;
306 const QMetaObject *localMetaObject =
nullptr;
309 auto shouldSingletonAlsoRegisterUnscoped = [&](){
310 Q_ASSERT(regType == QQmlType::SingletonType);
313 int idx = baseMetaObject->indexOfClassInfo(
"RegisterEnumClassesUnscoped");
316 if (qstrcmp(baseMetaObject->classInfo(idx).value(),
"false") == 0)
322 for (
int ii = 0; ii < metaObject->enumeratorCount(); ++ii) {
323 QMetaEnum me = metaObject->enumerator(ii);
324 const bool isScoped = me.isScoped();
325 QStringHash<
int> *e =
new QStringHash<
int>();
333 if (me.enclosingMetaObject() != localMetaObject) {
335 localMetaObject = me.enclosingMetaObject();
337 const bool shouldRegisterUnscoped = !isScoped
338 || (regType == QQmlType::CppType && extraData.cppTypeData->registerEnumClassesUnscoped)
339 || (regType == QQmlType::SingletonType && shouldSingletonAlsoRegisterUnscoped())
342 for (
int jj = 0; jj < me.keyCount(); ++jj) {
343 const QString key = QString::fromUtf8(me.key(jj));
344 const int value = me.value(jj);
345 if (shouldRegisterUnscoped) {
346 if (localEnums.contains(key)) {
347 auto existingEntry = enums->enums.find(key);
348 if (existingEntry != enums->enums.end() && existingEntry.value() != value) {
349 qWarning(
"Previously registered enum will be overwritten due to name clash: %s.%s", metaObject->className(), key.toUtf8().constData());
350 createEnumConflictReport(metaObject, key);
353 localEnums.insert(key);
355 enums->enums.insert(key, value);
357 e->insert(key, value);
361 enums->scopedEnumIndex.insert(QString::fromUtf8(me.name()), enums->scopedEnums.size());
362 enums->scopedEnums << e;
364 enums->unscopedEnumIndex.insert(QString::fromUtf8(me.name()), enums->unscopedEnums.size());
365 enums->unscopedEnums << e;
370void QQmlTypePrivate::createListOfPossibleConflictingItems(
const QMetaObject *metaObject, QList<EnumInfo> &enumInfoList, QStringList path)
const
372 path.append(QString::fromUtf8(metaObject->className()));
374 if (metaObject->d.relatedMetaObjects) {
375 const auto *related = metaObject->d.relatedMetaObjects;
378 createListOfPossibleConflictingItems(*related++, enumInfoList, path);
382 for (
int ii = 0; ii < metaObject->enumeratorCount(); ++ii) {
383 const auto e = metaObject->enumerator(ii);
385 for (
int jj = 0; jj < e.keyCount(); ++jj) {
386 const QString key = QString::fromUtf8(e.key(jj));
389 enumInfo.metaObjectName = QString::fromUtf8(metaObject->className());
390 enumInfo.enumName = QString::fromUtf8(e.name());
391 enumInfo.enumKey = key;
392 enumInfo.scoped = e.isScoped();
393 enumInfo.path = path;
394 enumInfo.metaEnumScope = QString::fromUtf8(e.scope());
395 enumInfoList.append(enumInfo);
400void QQmlTypePrivate::createEnumConflictReport(
const QMetaObject *metaObject,
const QString &conflictingKey)
const
402 QList<EnumInfo> enumInfoList;
405 metaObject = baseMetaObject;
408 qWarning() <<
"No meta object information available. Skipping conflict analysis.";
412 createListOfPossibleConflictingItems(metaObject, enumInfoList, QStringList());
414 qWarning().noquote() << QLatin1String(
"Possible conflicting items:");
416 for (
const auto &i : std::as_const(enumInfoList)) {
417 if (i.enumKey == conflictingKey)
418 qWarning().noquote().nospace() <<
" " << i.metaObjectName <<
"." << i.enumName <<
"." << i.enumKey <<
" from scope "
419 << i.metaEnumScope <<
" injected by " << i.path.join(QLatin1String(
"->"));
423void QQmlTypePrivate::insertEnumsFromPropertyCache(
424 Enums *enums,
const QQmlPropertyCache::ConstPtr &cache)
const
426 const QMetaObject *cppMetaObject = cache->firstCppMetaObject();
428 for (
const QQmlPropertyCache *currentCache = cache.data();
429 currentCache && currentCache->metaObject() != cppMetaObject;
430 currentCache = currentCache->parent().data()) {
432 int count = currentCache->qmlEnumCount();
433 for (
int ii = 0; ii < count; ++ii) {
434 QStringHash<
int> *scoped =
new QStringHash<
int>();
435 QQmlEnumData *enumData = currentCache->qmlEnum(ii);
437 for (
int jj = 0; jj < enumData->values.size(); ++jj) {
438 const QQmlEnumValue &value = enumData->values.at(jj);
439 enums->enums.insert(value.namedValue, value.value);
440 scoped->insert(value.namedValue, value.value);
442 enums->scopedEnums << scoped;
443 enums->scopedEnumIndex.insert(enumData->name, enums->scopedEnums.size()-1);
446 insertEnums(enums, cppMetaObject);
449void QQmlTypePrivate::setName(
const QString &uri,
const QString &element)
452 elementName = element;
453 name = uri.isEmpty() ? element : (uri + QLatin1Char(
'/') + element);
456QByteArray QQmlType::typeName()
const
459 if (d->regType == SingletonType || d->regType == CompositeSingletonType)
460 return d->extraData.singletonTypeData->singletonInstanceInfo->typeName;
461 else if (d->baseMetaObject)
462 return d->baseMetaObject->className();
467QString QQmlType::elementName()
const
471 return d->elementName;
474QString QQmlType::qmlTypeName()
const
482
483
484
485
486
487QObject *QQmlType::create()
const
490 return create(&unused, 0);
494
495
496
497
498
499
500
501
502
503
504
505QObject *QQmlType::create(
void **memory, size_t additionalMemory)
const
507 if (!d || !isCreatable())
510 QObject *rv = (QObject *)operator
new(d->extraData.cppTypeData->allocationSize + additionalMemory);
511 d->extraData.cppTypeData->newFunc(rv, d->extraData.cppTypeData->userdata);
514 *memory = ((
char *)rv) + d->extraData.cppTypeData->allocationSize;
519
520
521
522
523QObject *QQmlType::createWithQQmlData()
const
525 void *ddataMemory =
nullptr;
526 auto instance = create(&ddataMemory,
sizeof(QQmlData));
529 QObjectPrivate* p = QObjectPrivate::get(instance);
530 Q_ASSERT(!p->isDeletingChildren);
531 if (!p->declarativeData)
532 p->declarativeData =
new (ddataMemory) QQmlData(QQmlData::DoesNotOwnMemory);
536QQmlType::SingletonInstanceInfo::ConstPtr QQmlType::singletonInstanceInfo()
const
540 if (d->regType != SingletonType && d->regType != CompositeSingletonType)
542 return d->extraData.singletonTypeData->singletonInstanceInfo;
545QQmlCustomParser *QQmlType::customParser()
const
549 if (d->regType != CppType)
551 return d->extraData.cppTypeData->customParser;
554QQmlType::CreateValueTypeFunc QQmlType::createValueTypeFunction()
const
556 if (!d || d->regType != CppType)
558 return d->extraData.cppTypeData->createValueTypeFunc;
561bool QQmlType::canConstructValueType()
const
563 if (!d || d->regType != CppType)
565 return d->extraData.cppTypeData->constructValueType;
568bool QQmlType::canPopulateValueType()
const
570 if (!d || d->regType != CppType)
572 return d->extraData.cppTypeData->populateValueType;
575QQmlType::CreateFunc QQmlType::createFunction()
const
577 if (!d || d->regType != CppType)
579 return d->extraData.cppTypeData->newFunc;
582QString QQmlType::noCreationReason()
const
584 if (!d || d->regType != CppType)
586 return d->extraData.cppTypeData->noCreationReason;
589bool QQmlType::isCreatable()
const
591 return d && d->regType == CppType && d->extraData.cppTypeData->newFunc;
594QQmlType::ExtensionFunc QQmlType::extensionFunction()
const
599 switch (d->regType) {
601 return d->extraData.cppTypeData->extFunc;
603 return d->extraData.singletonTypeData->extFunc;
609const QMetaObject *QQmlType::extensionMetaObject()
const
614 switch (d->regType) {
616 return d->extraData.cppTypeData->extMetaObject;
618 return d->extraData.singletonTypeData->extMetaObject;
624bool QQmlType::isExtendedType()
const
626 return d && !d->init()->data.isEmpty();
629bool QQmlType::isSingleton()
const
631 return d && (d->regType == SingletonType || d->regType == CompositeSingletonType);
634bool QQmlType::isInterface()
const
636 return d && d->regType == InterfaceType;
639bool QQmlType::isComposite()
const
641 return d && d->isComposite();
644bool QQmlType::isCompositeSingleton()
const
650 return d && d->regType == CompositeSingletonType && !isInlineComponentType();
653bool QQmlType::isQObjectSingleton()
const
655 return d && d->regType == SingletonType && d->extraData.singletonTypeData->singletonInstanceInfo->qobjectCallback;
658bool QQmlType::isQJSValueSingleton()
const
660 return d && d->regType == SingletonType && d->extraData.singletonTypeData->singletonInstanceInfo->scriptCallback;
663bool QQmlType::isSequentialContainer()
const
665 return d && d->regType == SequentialContainerType;
668bool QQmlType::isValueType()
const
670 return d && d->isValueType();
673QMetaType QQmlType::typeId()
const
675 return d ? d->typeId : QMetaType{};
678QMetaType QQmlType::qListTypeId()
const
680 return d ? d->listId : QMetaType{};
683QMetaSequence QQmlType::listMetaSequence()
const
685 return isSequentialContainer() ? d->extraData.sequentialContainerTypeData : QMetaSequence();
688const QMetaObject *QQmlType::metaObject()
const
690 return d ? d->metaObject() :
nullptr;
693const QMetaObject *QQmlType::metaObjectForValueType()
const
696 return d->metaObjectForValueType();
699const QMetaObject *QQmlType::baseMetaObject()
const
701 return d ? d->baseMetaObject :
nullptr;
704bool QQmlType::containsRevisionedAttributes()
const
706 return d && d->init()->containsRevisionedAttributes;
709QTypeRevision QQmlType::metaObjectRevision()
const
711 return d ? d->revision : QTypeRevision();
714QQmlAttachedPropertiesFunc QQmlType::attachedPropertiesFunction(QQmlTypeLoader *typeLoader)
const
716 if (
const QQmlTypePrivate *base = d ? d->attachedPropertiesBase(typeLoader) :
nullptr)
717 return base->extraData.cppTypeData->attachedPropertiesFunc;
721const QMetaObject *QQmlType::attachedPropertiesType(QQmlTypeLoader *typeLoader)
const
723 if (
const QQmlTypePrivate *base = d ? d->attachedPropertiesBase(typeLoader) :
nullptr)
724 return base->extraData.cppTypeData->attachedPropertiesType;
728int QQmlType::parserStatusCast()
const
730 if (!d || d->regType != CppType)
732 return d->extraData.cppTypeData->parserStatusCast;
735int QQmlType::propertyValueSourceCast()
const
737 if (!d || d->regType != CppType)
739 return d->extraData.cppTypeData->propertyValueSourceCast;
742int QQmlType::propertyValueInterceptorCast()
const
744 if (!d || d->regType != CppType)
746 return d->extraData.cppTypeData->propertyValueInterceptorCast;
749int QQmlType::finalizerCast()
const
751 if (!d || d->regType != CppType)
753 return d->extraData.cppTypeData->finalizerCast;
756const char *QQmlType::interfaceIId()
const
758 if (!d || d->regType != InterfaceType)
760 return d->extraData.interfaceTypeData;
763int QQmlType::index()
const
765 return d ? d->index : -1;
768bool QQmlType::isInlineComponentType()
const {
769 return d ? d->regType == QQmlType::InlineComponentType :
false;
772QUrl QQmlType::sourceUrl()
const
774 return d ? d->sourceUrl() : QUrl();
777int QQmlType::enumValue(QQmlTypeLoader *typeLoader,
const QHashedStringRef &name,
bool *ok)
const
779 return QQmlTypePrivate::enumValue(d, typeLoader, name, ok);
782int QQmlType::enumValue(QQmlTypeLoader *typeLoader,
const QHashedCStringRef &name,
bool *ok)
const
784 return QQmlTypePrivate::enumValue(d, typeLoader, name, ok);
787int QQmlType::enumValue(QQmlTypeLoader *typeLoader,
const QV4::String *name,
bool *ok)
const
789 return QQmlTypePrivate::enumValue(d, typeLoader, name, ok);
792int QQmlType::scopedEnumIndex(QQmlTypeLoader *typeLoader,
const QV4::String *name,
bool *ok)
const
794 return QQmlTypePrivate::enumIndex<QQmlTypePrivate::Enums::Scoped>(
795 d, typeLoader, name, ok);
798int QQmlType::scopedEnumIndex(QQmlTypeLoader *typeLoader,
const QString &name,
bool *ok)
const
800 return QQmlTypePrivate::enumIndex<QQmlTypePrivate::Enums::Scoped>(
801 d, typeLoader, name, ok);
804int QQmlType::unscopedEnumIndex(QQmlTypeLoader *typeLoader,
const QV4::String *name,
bool *ok)
const
806 return QQmlTypePrivate::enumIndex<QQmlTypePrivate::Enums::Unscoped>(
807 d, typeLoader, name, ok);
810int QQmlType::unscopedEnumIndex(QQmlTypeLoader *typeLoader,
const QString &name,
bool *ok)
const
812 return QQmlTypePrivate::enumIndex<QQmlTypePrivate::Enums::Unscoped>(
813 d, typeLoader, name, ok);
816int QQmlType::scopedEnumValue(QQmlTypeLoader *typeLoader,
int index,
const QV4::String *name,
bool *ok)
const
818 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Scoped>(
819 d, typeLoader, index, name, ok);
822int QQmlType::scopedEnumValue(QQmlTypeLoader *typeLoader,
int index,
const QString &name,
bool *ok)
const
824 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Scoped>(
825 d, typeLoader, index, name, ok);
828int QQmlType::scopedEnumValue(QQmlTypeLoader *typeLoader,
const QHashedStringRef &scopedEnumName,
const QHashedStringRef &name,
bool *ok)
const
830 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Scoped>(
831 d, typeLoader, scopedEnumName, name, ok);
834int QQmlType::unscopedEnumValue(QQmlTypeLoader *typeLoader,
int index,
const QV4::String *name,
bool *ok)
const
836 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Unscoped>(
837 d, typeLoader, index, name, ok);
840int QQmlType::unscopedEnumValue(QQmlTypeLoader *typeLoader,
int index,
const QString &name,
bool *ok)
const
842 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Unscoped>(
843 d, typeLoader, index, name, ok);
846int QQmlType::unscopedEnumValue(QQmlTypeLoader *typeLoader,
const QHashedStringRef &scopedEnumName,
const QHashedStringRef &name,
bool *ok)
const
848 return QQmlTypePrivate::enumValue<QQmlTypePrivate::Enums::Unscoped>(
849 d, typeLoader, scopedEnumName, name, ok);
852QString QQmlType::scopedEnumKey(QQmlTypeLoader *typeLoader,
int index,
int value,
bool *ok)
const
854 return QQmlTypePrivate::enumKey<QQmlTypePrivate::Enums::Scoped>(
855 d, typeLoader, index, value, ok);
858QStringList QQmlType::scopedEnumKeys(QQmlTypeLoader *typeLoader,
int index,
int value,
bool *ok)
const
860 return QQmlTypePrivate::enumKeys<QQmlTypePrivate::Enums::Scoped>(
861 d, typeLoader, index, value, ok);
864QString QQmlType::unscopedEnumKey(QQmlTypeLoader *typeLoader,
int index,
int value,
bool *ok)
const
866 return QQmlTypePrivate::enumKey<QQmlTypePrivate::Enums::Unscoped>(
867 d, typeLoader, index, value, ok);
870QStringList QQmlType::unscopedEnumKeys(QQmlTypeLoader *typeLoader,
int index,
int value,
873 return QQmlTypePrivate::enumKeys<QQmlTypePrivate::Enums::Unscoped>(
874 d, typeLoader, index, value, ok);
878void QQmlType::refHandle(
const QQmlTypePrivate *priv)
884void QQmlType::derefHandle(
const QQmlTypePrivate *priv)
890int QQmlType::refCount(
const QQmlTypePrivate *priv)
893 return priv->count();
897void QQmlType::createProxy(QObject *instance)
const
899 const QQmlTypePrivate::ProxyMetaObjects *proxies = d->init();
900 if (!proxies->data.isEmpty())
901 (
void)
new QQmlProxyMetaObject(instance, &proxies->data);
Combined button and popup list for selecting options.
static bool isPropertyRevisioned(const QMetaObject *mo, int index)