230void QQmlContext::setContextProperty(
const QString &name,
const QVariant &value)
233 if (d->notifyIndex() == -1)
234 d->setNotifyIndex(QMetaObjectPrivate::absoluteSignalCount(&QQmlContext::staticMetaObject));
236 QQmlRefPointer<QQmlContextData> data = d->m_data;
238 if (data->isInternal()) {
239 qWarning(
"QQmlContext: Cannot set property on internal context.");
243 if (!data->isValid()) {
244 qWarning(
"QQmlContext: Cannot set property on invalid context.");
248 if (
bool isNumber =
false; name.toUInt(&isNumber), isNumber) {
249 qWarning(
"QQmlContext: Using numbers as context properties will be disallowed in a future Qt version.");
253 int idx = data->propertyIndex(name);
255 data->addPropertyNameAndIndex(name, data->numIdValues() + d->numPropertyValues());
256 d->appendPropertyValue(value);
257 data->refreshExpressions();
259 d->setPropertyValue(idx, value);
260 QMetaObject::activate(
this, d->notifyIndex(), idx,
nullptr);
263 if (
auto *obj = qvariant_cast<QObject *>(value)) {
264 connect(obj, &QObject::destroyed,
this, [d, name](QObject *destroyed) {
265 d->dropDestroyedQObject(name, destroyed);
297void QQmlContext::setContextProperties(
const QList<PropertyPair> &properties)
299 Q_D(
const QQmlContext);
301 QQmlRefPointer<QQmlContextData> data = d->m_data;
302 QQmlJavaScriptExpression *expressions = data->takeExpressions();
303 QQmlRefPointer<QQmlContextData> childContexts = data->takeChildContexts();
305 for (
const auto &property : properties)
306 setContextProperty(property.name, property.value);
308 data->setExpressions(expressions);
309 data->setChildContexts(childContexts);
310 data->refreshExpressions();
326 const QQmlRefPointer<QQmlContextData> &data, QObject *object,
const QString &name,
329 QQmlPropertyData local;
330 if (
const QQmlPropertyData *property = QQmlPropertyCache::property(object, name, data, &local)) {
331 *target = object->metaObject()->property(property->coreIndex()).read(object);
348QVariant QQmlContext::contextProperty(
const QString &name)
const
350 Q_D(
const QQmlContext);
352 const QQmlRefPointer<QQmlContextData> data = d->m_data;
354 const int idx = data->propertyIndex(name);
356 if (QObject *obj = data->contextObject()) {
358 if (readObjectProperty(data, obj, name, &value))
363 return parentContext()->contextProperty(name);
365 if (idx >= d->numPropertyValues())
366 return QVariant::fromValue(data->idValue(idx - d->numPropertyValues()));
368 return d->propertyValue(idx);
399 if (
const int propertyIndex = data->propertyIndex(name); propertyIndex >= 0) {
401 if (propertyIndex < numPropertyValues)
402 return qvariant_cast<QObject *>(d->propertyValue(propertyIndex));
403 return data->idValue(propertyIndex - numPropertyValues);
406 if (QObject *obj = data->contextObject()) {
408 if (readObjectProperty(data, obj, name, &result))
409 return qvariant_cast<QObject *>(result);
449QObject *QQmlContext::findObjectRecursively(
const QString &id)
const
451 Q_D(
const QQmlContext);
452 QQueue<QQmlRefPointer<QQmlContextData>> contexts;
453 contexts.enqueue(d->m_data);
455 while (!contexts.isEmpty()) {
456 const QQmlRefPointer<QQmlContextData> context = contexts.dequeue();
457 const QQmlContext *c = context->publicContext();
458 if (QObject *found = objectForNameInQQmlContextData(context, c ? c->d_func() :
nullptr, id))
461 for (
auto child = context->childContexts(); child; child = child->nextChild())
462 contexts.enqueue(child);
481QList<QObject *> QQmlContext::findObjectsRecursively(
const QString &id)
const
483 Q_D(
const QQmlContext);
485 QList<QObject *> result;
486 QQueue<QQmlRefPointer<QQmlContextData>> contexts;
487 contexts.enqueue(d->m_data);
489 while (!contexts.isEmpty()) {
490 const QQmlRefPointer<QQmlContextData> context = contexts.dequeue();
491 const QQmlContext *c = context->publicContext();
492 if (QObject *found = objectForNameInQQmlContextData(context, c ? c->d_func() :
nullptr, id))
493 result.append(found);
495 for (
auto child = context->childContexts(); child; child = child->nextChild())
496 contexts.enqueue(child);
542QJSValue QQmlContext::importedScript(
const QString &name)
const
544 Q_D(
const QQmlContext);
546 QV4::ExecutionEngine *v4 = engine()->handle();
547 QQmlTypeNameCache::Result r = d->m_data->imports()->query(name, v4->typeLoader());
548 QV4::Scope scope(v4);
549 QV4::ScopedObject scripts(scope, d->m_data->importedScripts());
550 return scripts ? QJSValuePrivate::fromReturnedValue(scripts->get(r.scriptIndex))
551 : QJSValue(QJSValue::UndefinedValue);
556 QQmlContext *context =
static_cast<QQmlContext*>(prop->object);
558 int contextProperty = (
int)(quintptr)prop->data;
560 if (d->propertyValue(contextProperty).userType() != qMetaTypeId<QList<QObject*> >())
563 return ((
const QList<QObject> *)d->propertyValue(contextProperty).constData())->size();
568 QQmlContext *context =
static_cast<QQmlContext*>(prop->object);
570 int contextProperty = (
int)(quintptr)prop->data;
572 if (d->propertyValue(contextProperty).userType() != qMetaTypeId<QList<QObject*> >())
575 return ((
const QList<QObject*> *)d->propertyValue(contextProperty).constData())->at(index);
580 if (!m_data->isValid())
583 const int idx = m_data->propertyIndex(name);
585 if (qvariant_cast<QObject *>(propertyValue(idx)) != destroyed)
588 setPropertyValue(idx, QVariant::fromValue<QObject *>(
nullptr));
589 QMetaObject::activate(q_func(), notifyIndex(), idx,
nullptr);
601 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)