231void QQmlContext::setContextProperty(
const QString &name,
const QVariant &value)
234 if (d->notifyIndex() == -1)
235 d->setNotifyIndex(QMetaObjectPrivate::absoluteSignalCount(&QQmlContext::staticMetaObject));
237 QQmlRefPointer<QQmlContextData> data = d->m_data;
239 if (data->isInternal()) {
240 qWarning(
"QQmlContext: Cannot set property on internal context.");
244 if (!data->isValid()) {
245 qWarning(
"QQmlContext: Cannot set property on invalid context.");
249 if (
bool isNumber =
false; name.toUInt(&isNumber), isNumber) {
250 qWarning(
"QQmlContext: Using numbers as context properties will be disallowed in a future Qt version.");
254 int idx = data->propertyIndex(name);
256 data->addPropertyNameAndIndex(name, data->numIdValues() + d->numPropertyValues());
257 d->appendPropertyValue(value);
258 data->refreshExpressions();
260 d->setPropertyValue(idx, value);
261 QMetaObject::activate(
this, d->notifyIndex(), idx,
nullptr);
264 if (
auto *obj = qvariant_cast<QObject *>(value)) {
265 connect(obj, &QObject::destroyed,
this, [d, name](QObject *destroyed) {
266 d->dropDestroyedQObject(name, destroyed);
298void QQmlContext::setContextProperties(
const QList<PropertyPair> &properties)
300 Q_D(
const QQmlContext);
302 QQmlRefPointer<QQmlContextData> data = d->m_data;
303 QQmlJavaScriptExpression *expressions = data->takeExpressions();
304 QQmlRefPointer<QQmlContextData> childContexts = data->takeChildContexts();
306 for (
const auto &property : properties)
307 setContextProperty(property.name, property.value);
309 data->setExpressions(expressions);
310 data->setChildContexts(childContexts);
311 data->refreshExpressions();
327 const QQmlRefPointer<QQmlContextData> &data, QObject *object,
const QString &name,
330 QQmlPropertyData local;
331 if (
const QQmlPropertyData *property = QQmlPropertyCache::property(object, name, data, &local)) {
332 *target = object->metaObject()->property(property->coreIndex()).read(object);
349QVariant QQmlContext::contextProperty(
const QString &name)
const
351 Q_D(
const QQmlContext);
353 const QQmlRefPointer<QQmlContextData> data = d->m_data;
355 const int idx = data->propertyIndex(name);
357 if (QObject *obj = data->contextObject()) {
359 if (readObjectProperty(data, obj, name, &value))
364 return parentContext()->contextProperty(name);
366 if (idx >= d->numPropertyValues())
367 return QVariant::fromValue(data->idValue(idx - d->numPropertyValues()));
369 return d->propertyValue(idx);
400 if (
const int propertyIndex = data->propertyIndex(name); propertyIndex >= 0) {
402 if (propertyIndex < numPropertyValues)
403 return qvariant_cast<QObject *>(d->propertyValue(propertyIndex));
404 return data->idValue(propertyIndex - numPropertyValues);
407 if (QObject *obj = data->contextObject()) {
409 if (readObjectProperty(data, obj, name, &result))
410 return qvariant_cast<QObject *>(result);
450QObject *QQmlContext::findObjectRecursively(
const QString &id)
const
452 Q_D(
const QQmlContext);
453 QQueue<QQmlRefPointer<QQmlContextData>> contexts;
454 contexts.enqueue(d->m_data);
456 while (!contexts.isEmpty()) {
457 const QQmlRefPointer<QQmlContextData> context = contexts.dequeue();
458 const QQmlContext *c = context->publicContext();
459 if (QObject *found = objectForNameInQQmlContextData(context, c ? c->d_func() :
nullptr, id))
462 for (
auto child = context->childContexts(); child; child = child->nextChild())
463 contexts.enqueue(child);
482QList<QObject *> QQmlContext::findObjectsRecursively(
const QString &id)
const
484 Q_D(
const QQmlContext);
486 QList<QObject *> result;
487 QQueue<QQmlRefPointer<QQmlContextData>> contexts;
488 contexts.enqueue(d->m_data);
490 while (!contexts.isEmpty()) {
491 const QQmlRefPointer<QQmlContextData> context = contexts.dequeue();
492 const QQmlContext *c = context->publicContext();
493 if (QObject *found = objectForNameInQQmlContextData(context, c ? c->d_func() :
nullptr, id))
494 result.append(found);
496 for (
auto child = context->childContexts(); child; child = child->nextChild())
497 contexts.enqueue(child);
543QJSValue QQmlContext::importedScript(
const QString &name)
const
545 Q_D(
const QQmlContext);
547 QV4::ExecutionEngine *v4 = engine()->handle();
548 QQmlTypeNameCache::Result r = d->m_data->imports()->query(name, v4->typeLoader());
549 QV4::Scope scope(v4);
550 QV4::ScopedObject scripts(scope, d->m_data->importedScripts());
551 return scripts ? QJSValuePrivate::fromReturnedValue(scripts->get(r.scriptIndex))
552 : QJSValue(QJSValue::UndefinedValue);
557 QQmlContext *context =
static_cast<QQmlContext*>(prop->object);
559 int contextProperty = (
int)(quintptr)prop->data;
561 if (d->propertyValue(contextProperty).userType() != qMetaTypeId<QList<QObject*> >())
564 return ((
const QList<QObject> *)d->propertyValue(contextProperty).constData())->size();
569 QQmlContext *context =
static_cast<QQmlContext*>(prop->object);
571 int contextProperty = (
int)(quintptr)prop->data;
573 if (d->propertyValue(contextProperty).userType() != qMetaTypeId<QList<QObject*> >())
576 return ((
const QList<QObject*> *)d->propertyValue(contextProperty).constData())->at(index);
581 if (!m_data->isValid())
584 const int idx = m_data->propertyIndex(name);
586 if (qvariant_cast<QObject *>(propertyValue(idx)) != destroyed)
589 setPropertyValue(idx, QVariant::fromValue<QObject *>(
nullptr));
590 QMetaObject::activate(q_func(), notifyIndex(), idx,
nullptr);
602 QQmlContext *publicContext,
const QQmlRefPointer<QQmlContextData> &parent,
int numPropertyValues() const
static bool readObjectProperty(const QQmlRefPointer< QQmlContextData > &data, QObject *object, const QString &name, QVariant *target)
static QObject * objectForNameInQQmlContextData(const QQmlRefPointer< QQmlContextData > &data, const QQmlContextPrivate *d, const QString &name)