Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt : Utilisation des signaux et slots

    20 septembre 2021 à 14:38:19

    bonjour,

    Après avoir suivi le tutoriel sur Qt (notamment sur l'utilisation des signaux et slots), j'ai essayé de faire un petit widget personnalisé.

    je voulais essayer de réaliser l'élément suivant :

    - un QLabel avec un text

    - Un QLineEdit pour afficher un chemin vers un fichier

    - Un bouton "Parcourir"

    l'appui sur le bouton "parcourir" déclenche l'ouverture d'un Qfiledialog::getOpenFileName qui est ensuite découpé en nom de fichier et chemin. ces deux éléments étant stockés dans l'object créé sour forme de QString.

    lorsque je teste cet élément, graphiquement, cela correspond bien.

    Par contre, l'appui sur le bouton "parcourir" ne déclenche pas la fonction "SelectFile()" qui est sensé déclencher l'affichage du QFileDialog.

    dans le constructeur de l'objet, j'ai pourtant déclaré:

    connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));

    Donc, je m'attendrais avec cette ligne à ce que lors d'un clique sur le bouton, la fonction selectfile de mon objet soit déclenchée.

    Hors, mon code ne rentre jamais dans la fonction SelectFile.

    Je ne comprend pas pourquoi. quelle erreur ai-je pu commettre pour aboutir à ce fonctionnement ?

    merci de votre aide,

    voici le .h de mon object :

    #ifndef UISELECTFILENAMEH_H
    #define UISELECTFILENAMEH_H
    
    #include <QWidget>
    #include <QPushButton>
    #include <QLabel>
    #include <QFileDialog>
    #include <QFileInfo>
    #include <QHBoxLayout>
    #include <QLineEdit>
    
    class UISelectFileNameH : public QWidget
    {
        Q_OBJECT
    
    public:
        UISelectFileNameH(QString,QWidget *parent = 0);
    
    public slots:
        void SelectFile();
    
    private:
        QString FilePathName;
        QString FileName;
        QString FilePath;
        QPushButton *button;
        QLabel *lbl;
        QLineEdit *ledit;
    };
    
    #endif // UISELECTFILENAMEH_H

    Voici le .cpp associé :

    #include "uiselectfilenameh.h"
    
    UISelectFileNameH::UISelectFileNameH(QString label,QWidget *parent): QWidget(parent)
    {
        // définition du widget principal
        //QWidget *window = new QWidget;
    
        //Definition des éléments graphiques
        button = new QPushButton(tr("Parcourir"), this);
        button->setFont(QFont("Times", 18, QFont::Bold));
    
        lbl = new QLabel(label, this);
        lbl->setFont(QFont("Times", 18, QFont::Bold));
    
        ledit = new QLineEdit(this);
        ledit->setText(FilePathName);
    
        FilePathName="";
        connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));
    
        // Positionnement des éléments
        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->addWidget(lbl);
        layout->addWidget(ledit);
        layout->addWidget(button);
    }
    
    void UISelectFileNameH::SelectFile()
    {
        FilePathName = QFileDialog::getOpenFileName(this, "Sélectionner");
        QFileInfo Temp(FilePathName);
        FilePath = Temp.filePath();
        FileName = Temp.fileName();
    }

    Et voici le main pour etre complet :

    // include éléments graphiques
    #include "UI\uiselectfilenameh.h"
    
    #include <QDebug>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
       // interface graphique
       //QCoreApplication app(argc, argv);
       QApplication app(argc, argv);
    
       //MainWidget widget;
       UISelectFileNameH *test1 = new UISelectFileNameH("Lecture : ");
       //widget.show();
       test1->show();
    
       return app.exec();
    }




    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2021 à 15:49:21

      Je pense que ton problème vient du C majuscule que tu as mis à "clicked" dans la connection de ton objet

      Dans la convention de nommage de Qt, les noms de fonctions commencent par des lettres minuscules et ce sont les classes qui commencent par des majuscules 

      Essaye donc de corriger ta ligne en virant ce C majuscule et ça devrait marcher parce que je ne vois rien d'autre 

      Note 1 : Je te conseil de suivre la même convention de nommage pour tes propres fonctions et classes que celle de Qt en renommant ta fonction SelectFile par selectFile. Ce sera toujours plus simple de s'y retrouver dans un plus gros projet si tous les noms de fonctions (les tiennes comme celles du framework utilisé) utilisent la même convention

      Note 2 : Tu utilises l'ancienne synthaxe de connexion vu que le cours que tu suis est ancien et pas mis à jour. Même si l'ancienne reste valide (je sais même pas si elle marche toujours sur Qt6), voici à quoi ressemble la nouvelle : https://wiki.qt.io/New_Signal_Slot_Syntax

      Dans ton cas précis, la ligne de connection serait donc :

      connect(button, &QPushButton::clicked, this, &UISelectFileNameH::SelectFile);



      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2021 à 20:59:53

        Salut,

        Et, au passage, la forme

        connect(button, SIGNAL(Clicked()), this, SLOT(SelectFile()));

        n'est plus utilisée depuis au moins dix ans!!!

        (moralité: il ne faut pas d'avantage suivre le tutoriel sur Qt que le cours de C++ sur ce site ;) )

        on préférera, effectivement, la forme

        connect(button, &QPushButton::clicked, this, &UISelectFileNameH::SelectFile)





        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          21 septembre 2021 à 8:18:07

          Bonjour,

          effectivement, cela fonctionne mieux avec cette syntaxe.

          Merci,

          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2021 à 16:21:52

            NicolasDurand18 a écrit:

            effectivement, cela fonctionne mieux avec cette syntaxe.

            Bonjour,

            Sujet résolu

            Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

            • Partager sur Facebook
            • Partager sur Twitter

            Qt : Utilisation des signaux et slots

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown