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 :

Utilisation de l'opérateur & dans une condition

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Par défaut Utilisation de l'opérateur & dans une condition
    Bonjour,

    Dans un projet, je trouve ce code et je ne comprend pas le sens du "&" dans l'expression testée.

    J'aurais plutôt testé e->buttons() == Qt::LeftButton, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (!e->buttons() & Qt::LeftButton) {
            setCursorShape(e->pos());
            return;
        }

  2. #2
    Membre Expert Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Par défaut
    C'est un masque.

    Par exemple si Qt::LeftButton vaut 00000001 :

    Si e->buttons() vaut 00010101 alors e->buttons() & Qt::LeftButton vaut 1
    Si e->buttons() vaut 00010100 alors e->buttons() & Qt::LeftButton vaut 0

    Ça sert à tester la valeur d'un bit particulier (ici le bit 0), tu pourrais avoir Qt::RightButton égal à 00000010 pour tester le bit 1, alors dans l'exemple précédent e->buttons() & Qt::RightButton vaudrait 0 dans les 2 cas.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Il faut vérifier avec le type qui est retourné, mais & est l'opérateur Et logique.

    Rappel de la table de vérité du ET (AND):
    0 AND 0 = 0
    1 AND 0 = 0
    0 AND 1 = 0
    1 AND 1 = 1

    La notation 0x est la notation hexadécimale

    On l'utilise pour tester un ou plusieurs bit(s) particulier(s) dans un octet:
    Valeur 0 & 3 = 0x00000000 & 0x00000011 = 0x00000000
    Valeur 9 & 3 = 0x00001001 & 0x00000011 = 0x00000001

    Valeur 0 & 70 = 0x00000000 & 0x01110000 = 0x00000000
    Valeur 127 & 70 = 0x0111111 & 0x01110000 = 0x01110000

    Donc c'est pratique lorsqu'on veut compresser un (des) booléen(s) (on parle de "flag" ou de masque) dans un (des) octet(s)
    Chaque bit correspond à un booléen


    Donc dans ton cas, cela permet de tester si la valeur Qt::LeftButton "est contenue" ou "allumé/ levé/ ..."

    Par contre c'est un test un peu crade parce que l'opérateur Et logique ne retourne 0 (faux) ou 1 (vrai) que si le "flag" testé est absent.

    Sinon il retournera 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Attention car ici on prend en plus la négation des boutons pour faire le test binaire : !e->buttons().

    Pour rappel en C (et c'est valable en C++) la valeur 0 vaut faux et toute autre valeur vaut vrai. Donc ce test sur les bits sera faux si aucun bit ne reste à 1. Comme tu as un ET le résultat sera différent de 0 seulement si l'expression à gauche contient le bit du flag Qt::LeftButton, et comme cette expression est inversée par l'opérateur ! , ton test est vrai quand buttons ne contient pas le bouton gauche.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Par défaut
    Merci pour ces explications même si je ne vois pas encore ce qu'a voulu faire le développeur ;-)

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Citation Envoyé par migrec Voir le message
    J'aurais plutôt testé e->buttons() == Qt::LeftButton, non ?
    La différence entre ce bout de code et celui que tu montres est que la comparaison ne permet qu'à un seul bit de e->buttons() de prendre une valeur non nulle (seulement un appui sur le bouton gauche) ; avec le masque, tu ignores tous les bits, sauf celui qui t'intéresse (appui au moins sur le bouton gauche, peut-être d'autres). D'autres détails dans la doc : http://doc.qt.io/qt-4.8/qmouseevent.html#buttons.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. utilisation d'une string dans une condition IF
    Par mamax29 dans le forum Langage
    Réponses: 1
    Dernier message: 05/05/2010, 09h30
  2. Utiliser un alias dans une condition.
    Par piscou51000 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2009, 19h49
  3. Utilisation de () dans une condition
    Par yann123456 dans le forum Langage
    Réponses: 3
    Dernier message: 27/02/2009, 10h42
  4. Utilisation de OR dans une condition
    Par Aspic dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2007, 16h40
  5. Utiliser un fichier externe dans une condition
    Par jpl56 dans le forum Deski
    Réponses: 4
    Dernier message: 13/10/2006, 10h24

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