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 :

Connecter un signal avec une lambda : avertissement du compilateur

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Connecter un signal avec une lambda : avertissement du compilateur
    Bonjour,

    alors je suis entrain de me former à Qt et je suis arrivé au chapitre SIGNAL, SLOT. Dans l'exemple de la formation l'auteur écrit cette ligne de code pour faire le lien entre un horizontalSlider et un progressBar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       //Functor Notation : Lambda
        connect(ui->horizontalSlider, &QSlider::valueChanged,
                [=](){
            ui->progressBar->setValue(ui->horizontalSlider->value());
        });
    Lorsque je refais la même chose j'ai un message warning qui me dit :

    Pass a context object as 3rd connect parameter [Lazy-connect-3arg-lambda]
    Je suis donc allé voir la documentation et voilà ce qui en ressort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    connect(sender, &QObject::destroyed, this, 
              [=](){ 
              this->m_objects.remove(sender); 
    });
    du coup je me demande à quoi correspond le this ? Qu'est ce que je dois mettre comme 3ème argument dans mon connect pour ne pas avoir ce warning ?

    Merci d'avance pour votre aide.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour votre cas, en troisième paramètre, je passerai ui, comme on peut le voir dans cet exemple : https://doc.qt.io/qt-5/signalsandslo...nd-slots-usage
    Sinon, le contexte est décrit comme suit :
    The context object provides information about in which thread the receiver should be executed. This is important, as providing the context ensures that the receiver is executed in the context thread.
    Bref, c'est un contexte pour indiqué depuis quel instance la slot sera appelé.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Merci pour ta réponse

    Alors effectivement en regardant la doc je comprend que vous me dites de mettre ui dans mon cas, mais là j'ai un message d'erreur :

    no matching member function for call to 'connect'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    connect(ui->pushButton,&QPushButton::clicked, ui, [=](){
           ui->label->setText("Lambda") ;
        });
    Par contre si j'écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    connect(ui->pushButton,&QPushButton::clicked, ui->pushButton, [=](){
           ui->label->setText("Lambda") ;
        });
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    connect(ui->pushButton,&QPushButton::clicked, ui->label, [=](){
           ui->label->setText("Lambda") ;
        });
    Le programme compile et j'ai plus le warning ... du coup je ne comprend pas réellement ce qui se passe

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    ui n'est pas un QObject ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    c'est un Widget si je ne dis pas de bêtises

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include "widget.h"
    #include "ui_widget.h"
    #include <QtDebug>
     
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
     
        /*
        // 1.String Notation
        connect(ui->pushButton, SIGNAL(clicked()),this, SLOT(changeText()));
        */
     
        /*
        // 2.Functor Notation : Regular Slots
        connect(ui->pushButton, &QPushButton::clicked,this,&Widget::changeText);
        */
     
        // 3.Functor Notation lambda
        connect(ui->pushButton,&QPushButton::clicked, this, [=](){
           ui->label->setText("Lambda") ;
        });
    }
     
    Widget::~Widget()
    {
        delete ui;
    }

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pouvez-vous nous montrer le contenu du fichier widget.h ? Je pense qu'il n'y a pas le Q_OBJECT.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Voici le contenu du fichier widget.h, mais le Q_OBJECT est présent, il est introduit par défaut par Qt Creator, j'y ai pas touché.

    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
    19
    20
    21
    22
    23
    24
    25
     
    #ifndef WIDGET_H
    #define WIDGET_H
     
    #include <QWidget>
     
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
     
    class Widget : public QWidget
    {
        Q_OBJECT
     
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
     
    private slots:
        void changeText();
     
    private:
        Ui::Widget *ui;
    };
    #endif // WIDGET_H

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    N'utilisant pas fréquemment cette forme, je ne saurais dire. En tout cas, je pense qu'il est préférable d'utiliser ui->label comme contexte.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Ok, merci pour ton aide en tout cas.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/11/2020, 12h24
  2. Acquérir un signal avec une horloge externe
    Par ALCYR dans le forum Signal
    Réponses: 0
    Dernier message: 31/03/2009, 16h56
  3. connection de vb6 avec une base de données acces2003
    Par korotimi dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/09/2008, 16h23
  4. Connecter 3 bâtiments avec une liaison sans fil
    Par guitare-safi dans le forum Hardware
    Réponses: 3
    Dernier message: 24/04/2008, 11h46
  5. connection Excel / As400 avec une variable
    Par NATOU2 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2008, 15h52

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