int QMetaObject::resolveProperty( int index ) const { if ( !superclass ) return -1; const QMetaProperty* p = d->propData + ( index - propertyOffset() ); return superclass->findProperty( p->n, TRUE ); }
void GoValueMetaObject::activatePropIndex(int propIndex) { // Properties are added first, so the first fieldLen methods are in // fact the signals of the respective properties. int relativeIndex = propIndex - propertyOffset(); activate(value, methodOffset() + relativeIndex, 0); }
int QMetaObject::indexOfProperty( const QMetaProperty* prop, bool super ) const { if ( *prop->meta == this ) return ( super ? propertyOffset() : 0 ) + ( prop - d->propData); if ( !super || !superclass ) return -1; return superclass->indexOfProperty( prop, super ); }
/*! Returns the property meta data for the property at index \a index or 0 if no such property exists. If \a super is TRUE, inherited properties are included. \sa propertyNames() */ const QMetaProperty* QMetaObject::property( int index, bool super ) const { int idx = index - ( super ? propertyOffset() : 0 ); if ( d->propData && idx >= 0 && idx < (int)d->numPropData ) return d->propData + idx; if ( !super || !superclass ) return 0; return superclass->property( index, super ); }
int QMetaObject::findProperty( const char *name, bool super ) const { for( int i = 0; i < d->numPropData; ++i ) { if ( d->propData[i].isValid() && qstrcmp( d->propData[i].name(), name ) == 0 ) { return ( super ? propertyOffset() : 0 ) + i; } } if ( !super || !superclass ) return -1; return superclass->findProperty( name, super ); }
QVariantMap qobject2qvariant(const T* object) { QVariantMap map; auto metaObject = T::staticMetaObject; for(int i = metaObject.propertyOffset(); i < metaObject.propertyCount(); ++i) { QMetaProperty prop = metaObject.property(i); map.insert(QString::fromLatin1(prop.name()), prop.readOnGadget(object)); } return map; }
int GoValueMetaObject::metaCall(QMetaObject::Call c, int idx, void **a) { //qWarning() << "GoValueMetaObject::metaCall" << c << idx; switch (c) { case QMetaObject::ReadProperty: case QMetaObject::WriteProperty: { // TODO Cache propertyOffset, methodOffset (and maybe qmlEngine) int propOffset = propertyOffset(); if (idx < propOffset) { return value->qt_metacall(c, idx, a); } GoMemberInfo *memberInfo = typeInfo->fields; for (int i = 0; i < typeInfo->fieldsLen; i++) { if (memberInfo->metaIndex == idx) { if (c == QMetaObject::ReadProperty) { DataValue result; hookGoValueReadField(qmlEngine(value), ref, memberInfo->reflectIndex, memberInfo->reflectGetIndex, memberInfo->reflectSetIndex, &result); if (memberInfo->memberType == DTListProperty) { if (result.dataType != DTListProperty) { panicf("reading DTListProperty field returned non-DTListProperty result"); } QQmlListProperty<QObject> *in = *reinterpret_cast<QQmlListProperty<QObject> **>(result.data); QQmlListProperty<QObject> *out = reinterpret_cast<QQmlListProperty<QObject> *>(a[0]); *out = *in; // TODO Could provide a single variable in the stack to ReadField instead. delete in; } else { QVariant *out = reinterpret_cast<QVariant *>(a[0]); unpackDataValue(&result, out); } } else { DataValue assign; QVariant *in = reinterpret_cast<QVariant *>(a[0]); packDataValue(in, &assign); hookGoValueWriteField(qmlEngine(value), ref, memberInfo->reflectIndex, memberInfo->reflectSetIndex, &assign); activate(value, methodOffset() + (idx - propOffset), 0); } return -1; } memberInfo++; } QMetaProperty prop = property(idx); qWarning() << "Property" << prop.name() << "not found!?"; break; } case QMetaObject::InvokeMetaMethod: { if (idx < methodOffset()) { return value->qt_metacall(c, idx, a); } GoMemberInfo *memberInfo = typeInfo->methods; for (int i = 0; i < typeInfo->methodsLen; i++) { if (memberInfo->metaIndex == idx) { // args[0] is the result if any. DataValue args[1 + MaxParams]; for (int i = 1; i < memberInfo->numIn+1; i++) { packDataValue(reinterpret_cast<QVariant *>(a[i]), &args[i]); } hookGoValueCallMethod(qmlEngine(value), ref, memberInfo->reflectIndex, args); if (memberInfo->numOut > 0) { unpackDataValue(&args[0], reinterpret_cast<QVariant *>(a[0])); } return -1; } memberInfo++; } QMetaMethod m = method(idx); qWarning() << "Method" << m.name() << "not found!?"; break; } default: break; // Unhandled. } return -1; }
int GoValueMetaObject::metaCall(QMetaObject::Call c, int idx, void **a) { switch (c) { case QMetaObject::ReadProperty: case QMetaObject::WriteProperty: { // TODO Cache propertyOffset, methodOffset, and qmlEngine results? if (idx < propertyOffset()) { return value->qt_metacall(c, idx, a); } GoMemberInfo *memberInfo = valuePriv->typeInfo->fields; for (int i = 0; i < valuePriv->typeInfo->fieldsLen; i++) { if (memberInfo->metaIndex == idx) { if (c == QMetaObject::ReadProperty) { DataValue result; hookGoValueReadField(qmlEngine(value), valuePriv->addr, memberInfo->reflectIndex, &result); QVariant *out = reinterpret_cast<QVariant *>(a[0]); unpackDataValue(&result, out); } else { DataValue assign; QVariant *in = reinterpret_cast<QVariant *>(a[0]); packDataValue(in, &assign); hookGoValueWriteField(qmlEngine(value), valuePriv->addr, memberInfo->reflectIndex, &assign); } return -1; } memberInfo++; } QMetaProperty prop = property(idx); qWarning() << "Property" << prop.name() << "not found!?"; break; } case QMetaObject::InvokeMetaMethod: { if (idx < methodOffset()) { return value->qt_metacall(c, idx, a); } GoMemberInfo *memberInfo = valuePriv->typeInfo->methods; for (int i = 0; i < valuePriv->typeInfo->methodsLen; i++) { if (memberInfo->metaIndex == idx) { // args[0] is the result if any. DataValue args[1 + MaxParams]; for (int i = 1; i < memberInfo->numIn+1; i++) { packDataValue(reinterpret_cast<QVariant *>(a[i]), &args[i]); } hookGoValueCallMethod(qmlEngine(value), valuePriv->addr, memberInfo->reflectIndex, args); if (memberInfo->numOut > 0) { unpackDataValue(&args[0], reinterpret_cast<QVariant *>(a[0])); } return -1; } memberInfo++; } QMetaMethod m = method(idx); qWarning() << "Method" << m.name() << "not found!?"; break; } default: break; // Unhandled. } return -1; }