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 :

Fonctionnement des signaux et slots

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2020
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Fonctionnement des signaux et slots
    Bonjour,

    Etant assez novice dans l'utilisation de Qt, je suis parti de l'exemple permettant de créer une petite fenêtre avec un menu (Menus Example de la base de données des exemples de QT Creator , Qt 6.6).
    Mon idée est de partir de cet exemple afin d'y rajouter au fur et à mesure des fonctionnalités.
    Une des fonctionnalités que je voudrais rajouter est d'enregistrer dans un fichier .txt les attributs d'un objet d'une classe (MyClasse) que je créée.

    Je n'ai pas de problème dans la création du fichier .txt ni dans l'implémentation de la classe (création de l'objet unObjet).

    Je créée un slot pour l'implémentation de MyClasse dans mainwindow.h :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    private slots:
        // ...
        void create();
        // ...
    private:
        void createActions();
        void createMenus();
     
        // ...
        QMenu *implementationMenu;
        QAction *createAct;
       // ...
     
    Dans mainwindow.cpp la classe est implémentée de la manière suivante :
     
    // ...
     
    void MainWindow::create()
    {
        MyClasse unObjet; // implémentation de MyClasse à l'aide du constructeur par défaut définit dans myclasse.h et myclasse.cpp
        infoLabel->setNum(unObjet.return_attribut); // Affiche la valeur d'un attribut de unObjet
     
    }
     
    void MainWindow::createActions()
     
    {
     
    // ...
     
        createAct = new QAction(tr("&Create"), this);
        createAct->setStatusTip(tr("Create an object MyClasse"));
        connect(createAct, &QAction::triggered, this, &MainWindow::create);
     
    // ...
     
    }
     
    void MainWindow::createMenus()
    {
    // ...
        implementationMenu = menuBar()->addMenu(tr("&Creation"));
        implementationMenu->addAction(createAct);
    // ...

    Le code précédent fonctionne bien (unObjet est bien créé et j'arrive à afficher la valeur de l'attribut dans la fenêtre principale).
    Pour tester ma nouvelle fonctionnalité, je voudrais écrire dans le fichier .txt la valeur de cet attribut. Mon idée est donc de passer en paramètre unObjet dans le slot save() de la manière suivante :

    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
    void MainWindow::save(MyClasse objet_parametre)
    {
        // Ecriture d'un attribut de objet_parametre dans le fichier
    }
     
    void MainWindow::createActions()
     
    {
     
    // ...
     
        saveAct = new QAction(tr("&Save"), this);
        saveAct->setShortcuts(QKeySequence::Save);
        saveAct->setStatusTip(tr("Save the document to disk"));
        connect(saveAct, &QAction::triggered, this, &MainWindow::save(unObjet);
     
    // ...
     
    }
    Le problème vient du fait que la dernière instruction ne fonctionne pas, j'ai systématiquement le message d'erreur : Undeclared identifier unObjet ... il semble que l'on ne puisse pas passer un paramètre dans le slot save() ou alors je ne le définit pas au bon endroit (mais alors ou faut-il le définir ???) et surtout je voudrais le créer impérativement via le menu de la fenêtre.
    Pouvez-vous m'aider ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Les signaux et slots sont des pointeurs de fonction, donc sans les arguments. Si tu veux faire cela, tu peux passer par une fonction lambda qui capture ton objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connect(saveAct, &QAction::triggered, this, [this, unObjet](){ save(unObjet); });
    Attention a la durée de vie de ton objet et aux copies.

    HS : il y a un bouton # pour poster du code.

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/09/2015, 10h15
  2. Réponses: 2
    Dernier message: 22/07/2015, 11h41
  3. [Débuter] [Designer] QListWidget : impossible d'ajouter des slots ou des signaux
    Par jcdole dans le forum Qt Creator
    Réponses: 1
    Dernier message: 15/10/2013, 10h23
  4. Réponses: 13
    Dernier message: 07/05/2013, 20h34
  5. [all version][pcntl] fonctionnement des signaux
    Par kaymak dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 15/12/2010, 20h30

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