232void QQmlPropertyPrivate::initProperty(QObject *obj,
const QString &name,
233 QQmlPropertyPrivate::InitFlags flags)
235 QQmlRefPointer<QQmlTypeNameCache> typeNameCache = context ? context->imports() :
nullptr;
237 QObject *currentObject = obj;
238 QList<QStringView> path;
239 QStringView terminal(name);
241 if (name.contains(QLatin1Char(
'.'))) {
242 path = QStringView{name}.split(QLatin1Char(
'.'));
243 if (path.isEmpty())
return;
246 for (
int ii = 0; ii < path.size() - 1; ++ii) {
247 const QStringView &pathName = path.at(ii);
251 if (typeNameCache && !pathName.isEmpty() && pathName.at(0).isUpper()) {
252 QQmlTypeLoader *typeLoader = QQmlTypeLoader::get(engine.data());
253 QQmlTypeNameCache::Result r = typeNameCache->query(pathName, typeLoader);
255 if (r.type.isValid()) {
256 QQmlAttachedPropertiesFunc func = r.type.attachedPropertiesFunction(typeLoader);
259 currentObject = qmlAttachedPropertiesObject(currentObject, func);
260 if (!currentObject)
return;
261 }
else if (r.importNamespace) {
262 if (++ii == path.size())
266 r = typeNameCache->query<QQmlTypeNameCache::QueryNamespaced::No>(
267 path.at(ii), r.importNamespace, typeLoader);
269 if (!r.type.isValid())
272 QQmlAttachedPropertiesFunc func = r.type.attachedPropertiesFunction(typeLoader);
276 currentObject = qmlAttachedPropertiesObject(currentObject, func);
280 }
else if (r.scriptIndex != -1) {
283 Q_ASSERT(!
"Unreachable");
290 QQmlPropertyData local;
291 const QQmlPropertyData *property = currentObject
292 ? QQmlPropertyCache::property(currentObject, pathName, context, &local)
298 if (currentObject || !(flags & InitFlag::AllowId))
301 for (
auto idContext = context; idContext; idContext = idContext->parent()) {
302 const int objectId = idContext->propertyIndex(pathName.toString());
303 if (objectId != -1 && objectId < idContext->numIdValues()) {
304 currentObject = idContext->idValue(objectId);
313 }
else if (property->isFunction()) {
317 if (ii == (path.size() - 2) && QQmlMetaType::isValueType(property->propType())) {
319 const QMetaObject *valueTypeMetaObject = QQmlMetaType::metaObjectForValueType(property->propType());
320 if (!valueTypeMetaObject)
return;
322 int idx = valueTypeMetaObject->indexOfProperty(path.last().toUtf8().constData());
323 if (idx == -1)
return;
325 QMetaProperty vtProp = valueTypeMetaObject->property(idx);
327 Q_ASSERT(idx <= 0x0000FFFF);
329 object = currentObject;
331 valueTypeData.setFlags(QQmlPropertyData::flagsForProperty(vtProp));
332 valueTypeData.setPropType(vtProp.metaType());
333 valueTypeData.setCoreIndex(idx);
337 if (!property->isQObject()) {
338 if (
auto asPropertyMap = qobject_cast<QQmlPropertyMap*>(currentObject))
339 currentObject = asPropertyMap->value(path.at(ii).toString()).value<QObject*>();
343 property->readProperty(currentObject, ¤tObject);
346 if (!currentObject)
return;
352 terminal = path.last();
353 }
else if (!currentObject) {
357 auto findSignalInMetaObject = [&](
const QByteArray &signalName) {
358 const QMetaMethod method = findSignalByName(currentObject->metaObject(), signalName);
359 if (!method.isValid())
362 object = currentObject;
367 QQmlData *ddata = QQmlData::get(currentObject,
false);
368 auto findChangeSignal = [&](QStringView signalName) {
369 if (
auto propName = QQmlSignalNames::changedSignalNameToPropertyName(signalName)) {
370 const QQmlPropertyData *d =
371 ddata->propertyCache->property(*propName, currentObject, context);
372 while (d && d->isFunction())
373 d = ddata->propertyCache->overrideData(d);
375 if (d && d->notifyIndex() != -1) {
376 object = currentObject;
377 core = *ddata->propertyCache->signal(d->notifyIndex());
384 const auto findSignal = [&](
const QString &signalName) {
385 if (ddata && ddata->propertyCache) {
387 const QQmlPropertyData *d
388 = ddata->propertyCache->property(signalName, currentObject, context);
393 while (d && !d->isFunction())
394 d = ddata->propertyCache->overrideData(d);
397 object = currentObject;
402 return findChangeSignal(signalName);
405 return findSignalInMetaObject(signalName.toUtf8());
408 auto signalName = QQmlSignalNames::handlerNameToSignalName(terminal);
410 if (findSignal(*signalName))
413 signalName = QQmlSignalNames::badHandlerNameToSignalName(terminal);
415 if (findSignal(*signalName)) {
418 <<
"is not a properly capitalized signal handler name."
419 << QQmlSignalNames::signalNameToHandlerName(*signalName)
420 <<
"would be correct.";
426 if (ddata && ddata->propertyCache) {
427 const QQmlPropertyData *property = ddata->propertyCache->property(
428 terminal, currentObject, context);
431 while (property && !property->isSignal()) {
432 if (!property->isFunction()) {
433 object = currentObject;
435 nameCache = terminal.toString();
438 property = ddata->propertyCache->overrideData(property);
441 if (!(flags & InitFlag::AllowSignal))
445 Q_ASSERT(property->isSignal());
446 object = currentObject;
452 findChangeSignal(terminal);
455 const QByteArray propertyName = terminal.toUtf8();
456 const QMetaProperty prop = findPropertyByName(currentObject->metaObject(), propertyName);
458 if (prop.isValid()) {
459 object = currentObject;
464 if (flags & InitFlag::AllowSignal)
465 findSignalInMetaObject(terminal.toUtf8());
940void QQmlPropertyPrivate::findAliasTarget(QObject *object, QQmlPropertyIndex bindingIndex,
941 QObject **targetObject,
942 QQmlPropertyIndex *targetBindingIndex)
944 QQmlData *data = QQmlData::get(object,
false);
946 int coreIndex = bindingIndex.coreIndex();
947 int valueTypeIndex = bindingIndex.valueTypeIndex();
949 const QQmlPropertyData *propertyData =
950 data->propertyCache?data->propertyCache->property(coreIndex):
nullptr;
951 if (propertyData && propertyData->isAlias()) {
952 QQmlVMEMetaObject *vme = QQmlVMEMetaObject::getForProperty(object, coreIndex);
954 QObject *aObject =
nullptr;
int aCoreIndex = -1;
int aValueTypeIndex = -1;
955 if (vme->aliasTarget(coreIndex, &aObject, &aCoreIndex, &aValueTypeIndex)) {
957 Q_ASSERT(valueTypeIndex == -1 || aValueTypeIndex == -1);
959 QQmlPropertyIndex aBindingIndex(aCoreIndex);
960 if (aValueTypeIndex != -1) {
961 aBindingIndex = QQmlPropertyIndex(aCoreIndex, aValueTypeIndex);
962 }
else if (valueTypeIndex != -1) {
963 aBindingIndex = QQmlPropertyIndex(aCoreIndex, valueTypeIndex);
966 findAliasTarget(aObject, aBindingIndex, targetObject, targetBindingIndex);
972 *targetObject = object;
973 *targetBindingIndex = bindingIndex;
1152QVariant QQmlPropertyPrivate::readValueProperty()
1154 auto doRead = [&](QQmlGadgetPtrWrapper *wrapper) {
1155 wrapper->read(object, core.coreIndex());
1156 return wrapper->readOnGadget(wrapper->property(valueTypeData.coreIndex()));
1159 if (isValueType()) {
1160 if (QQmlGadgetPtrWrapper *wrapper = QQmlGadgetPtrWrapper::instance(engine, core.propType()))
1161 return doRead(wrapper);
1162 if (QQmlValueType *valueType = QQmlMetaType::valueType(core.propType())) {
1163 QQmlGadgetPtrWrapper wrapper(valueType,
nullptr);
1164 return doRead(&wrapper);
1167 }
else if (core.isQList()) {
1168 auto coreMetaType = core.propType();
1171 if (coreMetaType.flags() & QMetaType::IsQmlList) {
1172 QQmlListProperty<QObject> prop;
1173 core.readProperty(object, &prop);
1174 return QVariant::fromValue(QQmlListReferencePrivate::init(prop, coreMetaType));
1177 QVariant result(coreMetaType);
1180 coreMetaType.construct(result.data());
1181 core.readProperty(object, result.data());
1185 }
else if (core.isQObject()) {
1187 QObject *rv =
nullptr;
1188 core.readProperty(object, &rv);
1189 return QVariant::fromValue(rv);
1193 if (!core.propType().isValid())
1194 return object->metaObject()->property(core.coreIndex()).read(object);
1198 void *args[] = {
nullptr, &value, &status };
1199 if (core.propType() == QMetaType::fromType<QVariant>()) {
1202 value = QVariant(core.propType(), (
void*)
nullptr);
1203 args[0] = value.data();
1205 core.readPropertyWithArgs(object, args);
1206 if (core.propType() != QMetaType::fromType<QVariant>() && args[0] != value.data())
1207 return QVariant(QMetaType(core.propType()), args[0]);
1408 QObject *object,
const QQmlPropertyData &property,
const QVariant &value,
1409 QQmlPropertyData::WriteFlags flags, QMetaType propertyMetaType, QMetaType variantMetaType,
1410 bool isUrl, QQmlEnginePrivate *enginePriv) {
1413 || variantMetaType == QMetaType::fromType<QString>()
1414 || propertyMetaType == QMetaType::fromType<QList<QUrl>>()
1415 || property.isQList()) {
1416 return {
false,
false};
1420 switch (propertyMetaType.id()) {
1421 case QMetaType::Bool:
1422 if (value.canConvert(propertyMetaType)) {
1423 bool b = value.toBool();
1424 return {
true, property.writeProperty(object, &b, flags)};
1426 return {
false,
false};
1427 case QMetaType::Int: {
1429 int i = value.toInt(&ok);
1430 return {ok, ok && property.writeProperty(object, &i, flags)};
1432 case QMetaType::UInt: {
1434 uint u = value.toUInt(&ok);
1435 return {ok, ok && property.writeProperty(object, &u, flags)};
1437 case QMetaType::Double: {
1439 double d = value.toDouble(&ok);
1440 return {ok, ok && property.writeProperty(object, &d, flags)};
1442 case QMetaType::Float: {
1444 float f = value.toFloat(&ok);
1445 return {ok, ok && property.writeProperty(object, &f, flags)};
1447 case QMetaType::QString:
1448 if (value.canConvert(propertyMetaType)) {
1449 QString s = value.toString();
1450 return {
true, property.writeProperty(object, &s, flags)};
1452 return {
false,
false};
1453 case QMetaType::QVariantMap:
1454 if (value.canConvert(propertyMetaType)) {
1455 QVariantMap m = value.toMap();
1456 return {
true, property.writeProperty(object, &m, flags)};
1458 return {
false,
false};
1464 QVariant converted = QQmlValueTypeProvider::createValueType(
1465 value, propertyMetaType, enginePriv ? enginePriv->v4Engine.get() :
nullptr);
1466 if (!converted.isValid()) {
1467 converted = QVariant(propertyMetaType);
1468 if (!QMetaType::convert(value.metaType(), value.constData(),
1469 propertyMetaType, converted.data())) {
1470 return {
false,
false};
1473 return {
true, property.writeProperty(object, converted.data(), flags)};
1580 QQmlListProperty<QObject> *prop, QMetaType metaType,
const void *data, DoAppend &&doAppend)
1582 QSequentialIterable iterable;
1583 if (!QMetaType::convert(metaType, data, QMetaType::fromType<QSequentialIterable>(), &iterable))
1584 return AssignResult::TypeMismatch;
1586 const QMetaSequence metaSequence = iterable.metaContainer();
1587 if (!metaSequence.hasConstIterator()
1588 || !metaSequence.canGetValueAtConstIterator()
1589 || !iterable.valueMetaType().flags().testFlag(QMetaType::PointerToQObject)) {
1590 return AssignResult::TypeMismatch;
1593 const void *container = iterable.constIterable();
1594 const void *end = metaSequence.constEnd(container);
1596 QObject *o =
nullptr;
1598 if (prop->at && prop->count && metaSequence.hasSize()
1599 && metaSequence.size(container) == prop->count(prop)) {
1600 void *it = metaSequence.constBegin(container);
1603 while (!metaSequence.compareConstIterator(it, end)) {
1604 metaSequence.valueAtConstIterator(it, &o);
1605 if (o != prop->at(prop, ++i)) {
1609 metaSequence.advanceConstIterator(it, 1);
1611 metaSequence.destroyConstIterator(it);
1616 void *it = metaSequence.constBegin(container);
1617 while (!metaSequence.compareConstIterator(it, end)) {
1618 metaSequence.valueAtConstIterator(it, &o);
1620 metaSequence.advanceConstIterator(it, 1);
1622 metaSequence.destroyConstIterator(it);
1625 metaSequence.destroyConstIterator(end);
1626 return same ? AssignResult::WasEqual : AssignResult::Copied;
1630 const QQmlPropertyData &property, QQmlPropertyData::WriteFlags flags,
1631 const QMetaType propertyMetaType,
const QMetaType variantMetaType,
const QVariant &value,
1634 if (propertyMetaType.flags() & QMetaType::IsQmlList) {
1635 QMetaType listValueType = QQmlMetaType::listValueType(propertyMetaType);
1639 QQmlMetaObject valueMetaObject = QQmlMetaType::rawMetaObjectForType(listValueType);
1641 QQmlListProperty<QObject> prop;
1642 property.readProperty(object, &prop);
1645 if (!prop.clear || !prop.append)
1648 const bool useNonsignalingListOps = prop.clear == &QQmlVMEMetaObject::list_clear
1649 && prop.append == &QQmlVMEMetaObject::list_append;
1650 if (useNonsignalingListOps) {
1651 prop.clear = &QQmlVMEMetaObject::list_clear_nosignal;
1652 prop.append = &QQmlVMEMetaObject::list_append_nosignal;
1655 auto doAppend = [&](QQmlListProperty<QObject> *propPtr, QObject *o) {
1656 if (Q_UNLIKELY(o && (valueMetaObject.isNull()
1657 || !QQmlMetaObject::canConvert(o, valueMetaObject)))) {
1658 qCWarning(lcIncompatibleElement)
1659 <<
"Cannot append" << o <<
"to a QML list of" << listValueType.name();
1662 propPtr->append(propPtr, o);
1666 AssignResult result = AssignResult::TypeMismatch;
1667 if (variantMetaType == QMetaType::fromType<QQmlListReference>()) {
1668 result = assignListToListProperty(
1669 &prop,
static_cast<
const QQmlListReference *>(value.constData()),
1670 std::move(doAppend));
1671 }
else if (variantMetaType == QMetaType::fromType<QObjectList>()) {
1672 result = assignListToListProperty(
1673 &prop,
static_cast<
const QObjectList *>(value.constData()),
1674 std::move(doAppend));
1675 }
else if (variantMetaType == QMetaType::fromType<QVariantList>()) {
1676 result = assignListToListProperty(
1677 &prop,
static_cast<
const QVariantList *>(value.constData()),
1678 std::move(doAppend));
1680 result = assignMetaContainerToListProperty(
1681 &prop, variantMetaType, value.data(), doAppend);
1682 if (result == AssignResult::TypeMismatch) {
1684 doAppend(&prop, QQmlMetaType::toQObject(value));
1685 result = AssignResult::Copied;
1689 if (useNonsignalingListOps && result == AssignResult::Copied) {
1690 Q_ASSERT(QQmlVMEMetaObject::get(object));
1691 QQmlVMEResolvedList(&prop).activateSignal();
1694 return result != AssignResult::TypeMismatch;
1695 }
else if (variantMetaType == propertyMetaType) {
1697 return property.writeProperty(object, v.data(), flags);
1699 QVariant outputList(propertyMetaType);
1700 const QQmlType type = QQmlMetaType::qmlListType(propertyMetaType);
1701 const QMetaSequence outputSequence = type.listMetaSequence();
1702 if (!outputSequence.canAddValue())
1703 return property.writeProperty(object, outputList.data(), flags);
1705 const QMetaType outputElementMetaType = outputSequence.valueMetaType();
1706 const bool outputIsQVariant = (outputElementMetaType == QMetaType::fromType<QVariant>());
1708 QSequentialIterable inputIterable;
1709 QVariant inputList = value;
1710 if (QMetaType::view(
1711 inputList.metaType(), inputList.data(),
1712 QMetaType::fromType<QSequentialIterable>(), &inputIterable)) {
1714 const QMetaSequence inputSequence = inputIterable.metaContainer();
1715 const QMetaType inputElementMetaType = inputSequence.valueMetaType();
1716 const bool inputIsQVariant = (inputElementMetaType == QMetaType::fromType<QVariant>());
1718 QVariant outputElement
1719 = outputIsQVariant ? QVariant() : QVariant(outputElementMetaType);
1720 QVariant inputElement
1721 = inputIsQVariant ? QVariant() : QVariant(inputElementMetaType);
1723 void *it = inputSequence.constBegin(inputList.constData());
1724 void *end = inputSequence.constEnd(inputList.constData());
1726 for (; !inputSequence.compareConstIterator(it, end);
1727 inputSequence.advanceConstIterator(it, 1)) {
1729 if (inputIsQVariant)
1730 inputSequence.valueAtIterator(it, &inputElement);
1732 inputSequence.valueAtIterator(it, inputElement.data());
1734 if (outputIsQVariant) {
1735 outputSequence.addValue(outputList.data(), &inputElement);
1736 }
else if (inputElement.metaType() == outputElement.metaType()) {
1737 outputSequence.addValue(outputList.data(), inputElement.constData());
1740 inputElement.metaType(), inputElement.constData(),
1741 outputElementMetaType, outputElement.data());
1742 outputSequence.addValue(outputList.data(), outputElement.constData());
1746 inputSequence.destroyConstIterator(it);
1747 inputSequence.destroyConstIterator(end);
1748 }
else if (outputIsQVariant) {
1749 outputSequence.addValue(outputList.data(), &value);
1750 }
else if (outputElementMetaType == value.metaType()){
1751 outputSequence.addValue(outputList.data(), value.constData());
1753 QVariant output(outputElementMetaType);
1755 value.metaType(), value.constData(), outputElementMetaType, output.data());
1756 outputSequence.addValue(outputList.data(), output.constData());
1759 return property.writeProperty(object, outputList.data(), flags);
1763bool QQmlPropertyPrivate::write(
1764 QObject *object,
const QQmlPropertyData &property,
const QVariant &value,
1765 const QQmlRefPointer<QQmlContextData> &context, QQmlPropertyData::WriteFlags flags)
1767 const QMetaType propertyMetaType = property.propType();
1768 const QMetaType variantMetaType = value.metaType();
1770 const BindingFixer bindingFixer(object, property, flags);
1772 if (property.isEnum()) {
1773 QMetaProperty prop = object->metaObject()->property(property.coreIndex());
1776 if (variantMetaType == QMetaType::fromType<
double>()) {
1778 double fractional = std::modf(value.toDouble(), &integral);
1779 if (qFuzzyIsNull(fractional))
1780 v.convert(QMetaType::fromType<qint32>());
1782 return writeEnumProperty(prop, property.coreIndex(), object, v, flags);
1785 QQmlEnginePrivate *enginePriv = QQmlEnginePrivate::get(context);
1786 const bool isUrl = propertyMetaType == QMetaType::fromType<QUrl>();
1789 if (tryAssignBinding(object, property, value, variantMetaType))
1793 if (propertyMetaType == variantMetaType && !isUrl
1794 && propertyMetaType != QMetaType::fromType<QList<QUrl>>() && !property.isQList()) {
1795 return property.writeProperty(object,
const_cast<
void *>(value.constData()), flags);
1796 }
else if (property.isQObject()) {
1797 QVariant val = value;
1799 if (variantMetaType == QMetaType::fromType<std::nullptr_t>()) {
1802 varType = QMetaType::fromType<QObject*>();
1803 val = QVariant(varType,
nullptr);
1805 varType = variantMetaType;
1807 QQmlMetaObject valMo = rawMetaObjectForType(varType);
1808 if (valMo.isNull() || !varType.flags().testFlag(QMetaType::PointerToQObject))
1810 QObject *o = *
static_cast<QObject *
const *>(val.constData());
1811 QQmlMetaObject propMo = rawMetaObjectForType(propertyMetaType);
1816 if (QQmlMetaObject::canConvert(valMo, propMo)) {
1817 return property.writeProperty(object, &o, flags);
1818 }
else if (!o && QQmlMetaObject::canConvert(propMo, valMo)) {
1822 return property.writeProperty(object, &o, flags);
1826 }
else if (ConvertAndAssignResult result = tryConvertAndAssign(
1827 object, property, value, flags, propertyMetaType, variantMetaType, isUrl,
1829 return result.couldWrite;
1830 }
else if (propertyMetaType == QMetaType::fromType<QVariant>()) {
1831 return property.writeProperty(object,
const_cast<QVariant *>(&value), flags);
1834 if (variantMetaType == QMetaType::fromType<QUrl>()) {
1836 if (compatResolveUrlsOnAssigment() && context && u.isRelative() && !u.isEmpty())
1837 u = context->resolvedUrl(u);
1839 else if (variantMetaType == QMetaType::fromType<QByteArray>())
1840 u = QUrl(QString::fromUtf8(value.toByteArray()));
1841 else if (variantMetaType == QMetaType::fromType<QString>())
1842 u = QUrl(value.toString());
1846 return property.writeProperty(object, &u, flags);
1847 }
else if (propertyMetaType == QMetaType::fromType<QList<QUrl>>()) {
1848 QList<QUrl> urlSeq = compatResolveUrlsOnAssigment()
1849 ? urlSequence(value, context)
1850 : urlSequence(value);
1851 return property.writeProperty(object, &urlSeq, flags);
1852 }
else if (property.isQList()) {
1853 return assignToListProperty(property, flags, propertyMetaType, variantMetaType, value, object);
1854 }
else if (enginePriv && propertyMetaType == QMetaType::fromType<QJSValue>()) {
1856 QJSValue jsValue = QJSValuePrivate::fromReturnedValue(
1857 enginePriv->v4Engine->metaTypeToJS(variantMetaType, value.constData()));
1858 return property.writeProperty(object, &jsValue, flags);
1860 Q_ASSERT(variantMetaType != propertyMetaType);
1864 if (variantMetaType == QMetaType::fromType<QString>())
1865 v = QQmlStringConverters::variantFromString(value.toString(), propertyMetaType, &ok);
1869 if (v.convert(propertyMetaType)) {
1878 QSequentialIterable iterable;
1879 v = QVariant(propertyMetaType);
1880 if (QMetaType::view(
1881 propertyMetaType, v.data(),
1882 QMetaType::fromType<QSequentialIterable>(),
1884 const QMetaSequence propertyMetaSequence = iterable.metaContainer();
1885 if (propertyMetaSequence.canAddValueAtEnd()) {
1886 const QMetaType elementMetaType = iterable.valueMetaType();
1887 void *propertyContainer = iterable.mutableIterable();
1889 if (variantMetaType == elementMetaType) {
1890 propertyMetaSequence.addValueAtEnd(propertyContainer, value.constData());
1892 }
else if (variantMetaType == QMetaType::fromType<QVariantList>()) {
1893 const QVariantList list = value.value<QVariantList>();
1894 for (
const QVariant &valueElement : list) {
1895 if (valueElement.metaType() == elementMetaType) {
1896 propertyMetaSequence.addValueAtEnd(
1897 propertyContainer, valueElement.constData());
1899 QVariant converted(elementMetaType);
1901 valueElement.metaType(), valueElement.constData(),
1902 elementMetaType, converted.data());
1903 propertyMetaSequence.addValueAtEnd(
1904 propertyContainer, converted.constData());
1908 }
else if (elementMetaType.flags().testFlag(QMetaType::PointerToQObject)) {
1909 const QMetaObject *elementMetaObject = elementMetaType.metaObject();
1910 Q_ASSERT(elementMetaObject);
1912 const auto doAppend = [&](QObject *o) {
1913 QObject *casted = elementMetaObject->cast(o);
1914 propertyMetaSequence.addValueAtEnd(propertyContainer, &casted);
1917 if (variantMetaType.flags().testFlag(QMetaType::PointerToQObject)) {
1918 doAppend(*
static_cast<QObject *
const *>(value.data()));
1920 }
else if (variantMetaType == QMetaType::fromType<QQmlListReference>()) {
1921 const QQmlListReference *reference
1922 =
static_cast<
const QQmlListReference *>(value.constData());
1923 Q_ASSERT(elementMetaObject);
1924 for (
int i = 0, end = reference->size(); i < end; ++i)
1925 doAppend(reference->at(i));
1927 }
else if (!iterateQObjectContainer(
1928 variantMetaType, value.data(), doAppend)) {
1929 doAppend(QQmlMetaType::toQObject(value));
1932 QVariant converted = value;
1933 if (converted.convert(elementMetaType)) {
1934 propertyMetaSequence.addValueAtEnd(propertyContainer, converted.constData());
1942 if (!ok && QQmlMetaType::isInterface(propertyMetaType)) {
1943 auto valueAsQObject = qvariant_cast<QObject *>(value);
1945 if (
void *iface = valueAsQObject
1946 ? valueAsQObject->qt_metacast(QQmlMetaType::interfaceIId(propertyMetaType))
1951 return property.writeProperty(object, &iface, flags);
1956 return property.writeProperty(object,
const_cast<
void *>(v.constData()), flags);