QVariant QgsProperty::propertyValue( const QgsExpressionContext &context, const QVariant &defaultValue, bool *ok ) const { if ( ok ) *ok = false; if ( !d->active ) return defaultValue; switch ( d->type ) { case StaticProperty: { if ( ok ) *ok = true; return d->staticValue; } case FieldBasedProperty: { QgsFeature f = context.feature(); if ( !f.isValid() ) return defaultValue; //shortcut the field lookup if ( d->cachedFieldIdx >= 0 ) { if ( ok ) *ok = true; return f.attribute( d->cachedFieldIdx ); } int fieldIdx = f.fieldNameIndex( d->fieldName ); if ( fieldIdx < 0 ) return defaultValue; if ( ok ) *ok = true; return f.attribute( fieldIdx ); } case ExpressionBasedProperty: { d.detach(); if ( !d->expressionPrepared && !prepare( context ) ) return defaultValue; QVariant result = d->expression.evaluate( &context ); if ( result.isValid() ) { if ( ok ) *ok = true; return result; } else { return defaultValue; } } case InvalidProperty: return defaultValue; }; return QVariant(); }