Bonjour gizmo27
QVariant contient int et un int est un QVariant
Oui et non :
- QVariant est un objet qui peut contienir un objet de n'importe quel type
- mais un int n'est pas un QVariant. Un QVariant est un QVariant et c'est tout
Lorsque tu appelles setParameterValue en passant un int, c'est bien un QVariant qui est passé en paramètre et pas un int. Il s'agit d'une conversion implicite réalisée par le compilateur.
Pour simplifier, le compilateur travaille en 2 temps lorsque tu écris
effect.setParameterValue(parameter, i);
:
- il recherche une fonction avec la signature suivante :
Effect::setParameterValue(EffectParameter, int)
(ou ses dérivées :
Effect::setParameterValue(EffectParameter, int&)
,
Effect::setParameterValue(EffectParameter, const int&)
, etc.). Ici, il n'existe pas de fonctions qui conviennent.
- comme il ne trouve pas, il recherche s'il peut convertir un int en QVariant. Pour cela, il sait qu'il existe un constructeur pour QVariant qui prend un int en paramètre. Il l'utilise donc.
Au final, le compilateur traduit l'appel de :
effect.setParameterValue(parameter, i);
en
effect.setParameterValue(parameter, QVariant(i));
En fait, tous constructeurs qui n'est pas précédé du mot clé "explicit" et qui prend un type comme paramètre d'entrée (autre que le type construit, sinon c'est un constructeur de recopie) peut être appelé automatiquement par le compilateur pour faire des conversions.
Et regarde la liste des constructeurs de QVariant, ils sont nombreux pour permettre au compilateur de faire des conversions implicites automatiquement.
C'est plus claire ?
Partager