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 :

Connexion entre signal et slot : slot non existant

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut Connexion entre signal et slot : slot non existant
    Bonjour,

    Je développe un logiciel en c++ (sous VS2019) avec une interface graphique sous Qt.

    L'interface graphique est définie dans GUI.cpp et j'aimerai allumer une lumière qui est pilotée par un périphérique dont la classe s'appelle Device et la méthode Device::AllumerLumiere()

    J'ai donc dans GUI.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(ui.button1, SIGNAL(clicked()), this, SLOT(Device::AllumerLumiere()), Qt::ConnectionType::UniqueConnection
    Pas de problème de compilation, le logiciel se lance. Mais dans la sortie Déboguer j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect: No such slot GUI::Device::AllumerLumiere() in blablabla
    Comment faire appel au slot de ma classe Device sur l'appui du bouton button1 déclaré dans GUI??

    Merci.

    Ioro

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Déjà, tu utilises ici une très vieille syntaxe pour la fonction connect, car, depuis l'arrivée de C++11 (cela date déjà de 8 ans!!! il est donc plus que temps de s'y habituer )

    Ensuite, si tu veux appeler une fonction propre au périphérique, tu dois indiquer ... le périphérique comme récepteur, et non ta classe d'interface graphique

    La connexion prendrait alors une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* je considère que tu as un pointeur sur le périphérique nommé m_periph, par facilité, et qu'il existe, pour ce périphérique,
     * une fonction changeLightState qui allume la lumière si elle est éteinte et qui l'éteint si elle est allumée
     */
    connect(ui.button1, &QPushButton::clicked, m_periph, &Device::changeLightState);
    Ou bien, et c'est sans doute un peu plus intelligent, tu crées un slot spécifique qui fera appel à la fonction (spécifique au périphérique) qui doit être appelée au travers du périphérique.

    Tu aurais donc une fonction membre dans ta classe d'interface qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /* je considère que ta classe d'interface est nommée MainWindow 
     * que le périphérique est représenté par un pointeur nommé m_periph
     * et qu'il existe les fonctions 
     * - allumerLumiere pour allumer la lampe
     * - etiendreLumiere pour l'éteindre
     * - etatLumiere renvoyant true la lampe est allumée et false si elle est éteinte
     */
    /* la fonction changeLightState est déclarée sous la forme de
     void changeLightState();
     * dans la classe MainWindow
     */
    void MainWindow::changeLightState(){
        if(m_periph->etatLumiere()){
            m_periph->allumerLumiere();
        else
            m_periph->eteindreLumiere();
        }
    }
    et la connexion prendrait alors la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui.button1, &QPushButton::clicked, this, &MainWindow::changeLightState);
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Aaaaah! Merci pour l'explication! Je faisais n'importe quoi en fait ^^

    Bon ça marche beaucoup mieux!

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Bonjour

    Je bricole encore sur les SIGNAL/SLOTS et j'essaie plusieurs choses, notamment, afficher une valeur dans un QLCDNumber en fonction d'un QSlider.

    J'ai donc écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui.slider2, &QSlider::valueChanged(int), ui.lcdMonitorP, &QLCDNumber::display(int));
    ça ne fonctionne pas du tout.... (ceci dit, ça fonctionne avec l'ancienne façon d'écrire)

    L'idée étant de remplacer le slider par la valeur d'un signal lu en sortie d'un µC que j'aimerai afficher en continu.
    Et ça, je ne sais pas comment faire...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Contrairement à la syntaxe obsolète, tu ne dois pas mettre les types des paramètres (ni les parenthèses). Il s'agit de juste passer l'adresse des fonctions membres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui.slider2, &QSlider::valueChanged, ui.lcdMonitorP, &QLCDNumber::display);
    La mention des types des paramètres ne devient nécessaire que si la fonction membre est surchargée, mais cela se fait autrement (cf. ce sujet).

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Bonjour,

    J'ai écris exactement la même syntaxe et j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2664:  'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const'*: impossible de convertir l'argument 2 de 'void (__cdecl QAbstractSlider::* )(int)' en 'const char *'

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    La mention des types des paramètres ne devient nécessaire que si la fonction membre est surchargée, mais cela se fait autrement (cf. ce sujet).
    Et visiblement c'est le cas ici . La doc fait état de trois surcharges pour QLCDNumber::display.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Ah l'andouille que je fais ^^
    Merci pour le coup de pouce

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2019
    Messages : 21
    Par défaut
    Et est-il possible de dire à display d'appliquer une autre fonction?
    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui.slider2, &QSlider::valueChanged, ui.lcdMonitorP, static_cast<void (QLCDNumber::*)(double)> (&QLCDNumber::display(afficherMaValeur());
    Enfin, c'est ce que je voudrais faire mais VS me dit que c'est pas possible ^^

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ta demande n'est pas du tout claire.
    S'agit-il d'appeler display puis afficherMaValeur ? Ou de juste appeler afficherMaValeur à la place ?

    Dans le premier cas, à la place de display connecte un slot (ou une fonction lambda) qui fait appel aux deux.
    Dans le second, connecte-la à la place de display.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/11/2012, 11h33
  2. connect() et slot non existant
    Par maryem_kh dans le forum Débuter
    Réponses: 4
    Dernier message: 08/05/2012, 17h44
  3. Connexion entre signal et slot
    Par illyria86 dans le forum Débuter
    Réponses: 6
    Dernier message: 15/01/2011, 19h45
  4. Problème de connexion entre un signal et un slot
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 11/01/2011, 13h40
  5. Connexion "directe" signal - slot
    Par broidsy dans le forum Qt
    Réponses: 3
    Dernier message: 27/02/2006, 10h37

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