IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

À propos des types de QVariant

  1. #1
    Invité
    Invité(e)
    Par défaut À propos des types de QVariant
    Bonjour,
    En fait ma question est un peu un mélange de Qt et de c++. Même avec les tutos j'ai mal saisi le principe.
    Cela concerne cette enum que j'ai vue dans la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum Type{Invalid, BitArray, Bitmap, Bool, ..., UserType }
    Ici j'essaie de comprendre comment ça marche : un nouveau type énuméré Type est crée : ce type peut être chacun des types énumérés.

    Ensuite j'ai vu sur la doc dans la classe EffectParameter que QVariant pouvait contenir int ou double

    Par exemple pour la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Effect::setParameterValue ( const EffectParameter & parameter, const QVariant & value )
    Ici je m'intéresse au 2ème paramètre QVariant : dans un forum j'ai vu qu'on pouvait passer un int
    Ce que je n'arrive pas à voir c'est que dans l'énumération cela devrait être un QVariant::int : dans l'exemple pour moi le int est à part
    Pour moi on ne peut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n;
    QVariant entier=n
    En fait ici j'ai du mal à distinguer :
    QVariant contient int et un int est un QVariant. J'ai du mal à saisir le concept... Dommage que les tutos ne s'attardent pas là-dessus.
    Pardonnez-moi mais ça me chagrine depuis hier j'ai pas pû dormir de la nuit (non je plaisante). Merci et bonne journée.
    Dernière modification par dourouc05 ; 25/04/2011 à 13h53.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut,
    QVariant est une sorte de void * mais en plus safe.
    Le type sert à savoir ce qu'il y as dedans. Il est possible d'étendre les type qu'il peux contenir.

    C'est un équivalent à boost::any.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Donc à la question : peut-on passer un int à un paramètre de type QVariant, la réponse est bien oui ?
    PS : pour l'instant je cherche juste à savoir ça car le compilo ne bronche pas une seconde quand je fais ça.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Ben oui, regarde les constructeurs de QVariant. C'est le but, de pouvoir passer n'importe quoi.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    effect.setParameterValue(parameter, i);
    :

    - il recherche une fonction avec la signature suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Effect::setParameterValue(EffectParameter, int)
    (ou ses dérivées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Effect::setParameterValue(EffectParameter, int&)
    ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    effect.setParameterValue(parameter, i);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui ça va mieux.
    Merci pour l'explication.
    J'ai effectivement regardé les différents constructeurs... Maintenant je comprend mieux à quoi il servent.
    Bonne journée à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03
  2. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  3. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  4. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  5. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo