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 :

Object::connect: No such signal (signaux et slots privés)

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Object::connect: No such signal (signaux et slots privés)
    Bonjour à tous,

    Je viens à vous car je ne sais plus ou chercher.

    Donc ce que j'essaie de faire est de transférer une string provenant de une ou plusieurs QLineEdit et de la transférer dans un QTextEdit.
    Chaque QLineEdit devra transférer sont contenue dans un seul QTextEdit mais à une ligne bien spécifique suivant le QLineEdit,
    comme vous pouvez voir sur l'image ci-dessous, les champs de texte reliés aux différentes lignes du QTextEdit par un un trait noir rajouté en dessin par mes soins.



    Le transfère dois se faire comme un "textChanged()" mais je dois aussi pourvoir récupéré l'id (un simple int) pour savoir à qu'elle ligne placer la string, du coup je dois faire un signal (personnel) prenant en paramètre "monSignal(const QString &, int);"

    j'ai codé (il me semble) tout ce qu'il fallait mais le QObject:::connect n'arrive pas à trouver le signal, l'erreur en question est aussi affiché sur le Screenshots.

    Voici le code du fichier TabWindow.hpp:

    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
    #ifndef                         __GENERAL__
    #define                         __GENERAL__
     
    #include                        "Header.hpp"
     
    class                           TabWindow: public QGridLayout, public Report
    {
      Q_OBJECT
     
    private slots:
      void                          ReceiveTextChanged(const QString &, int index);
     
    public:
     
    signals:
      void                          SendTextChanged(const QString &, int index);
     
     
     
    private:
      int                           _enum;
      EnumData                      *Data;
      QTextDocument                 *DocReport;
      QList<QLineEdit*>             *LineGeneralData;
      QTextEdit                     *EditReport;
     
    public:
      TabWindow(QWidget *Win = 0);
      ~TabWindow();
    };
     
    #endif
    Voici le code du fichier TabWindow.cpp:

    Mon constructeur prends en paramètre un QMainWindow.

    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
    #include                                "Header.hpp"
     
    TabWindow::TabWindow(QWidget *Widget)
      : QGridLayout(Widget)
    {
      int                                   index = 0;
      Data                                  = new EnumData();
      LineGeneralData                       = new QList<QLineEdit*>;
      EditReport                            = new QTextEdit();
      DocReport                             = new QTextDocument(QString("Report"), EditReport);
     
      OpenFileReport();
      EditReport->setText(ReadReport());
      this->addWidget(EditReport, 0, 3, 12, 3, 0);
     
      while (index < 11)
        {
          LineGeneralData->push_back(new QLineEdit());
     
          this->addWidget(new QLabel(Data->G_Data[index]), index, 0, Qt::AlignLeft | Qt::AlignTop);
          this->addWidget(LineGeneralData->at(index), index, 1, Qt::AlignLeft);
     
          QObject::connect(LineGeneralData->at(index), SIGNAL(SendTextChanged(const QString &, int)),
                           LineGeneralData->at(index), SLOT(ReceiveTextChanged(const QString &, int)));
     
          this->setRowStretch(index , 1);
          this->setRowStretch(index , 0);
          index++;
        }
    }
     
    void                            TabWindow::ReceiveTextChanged(const QString & _str, int index)
    {
      // EditReport->find(Data->G_Data[_enum], QTextDocument::FindWholeWords);                                                                                                                                   
      // std::cout << "Debug[ReceiveTextChanged]: " << _str.toStdString() << std::endl;                                                                                                                          
      // EditReport->append(_str);                                                                                                                                                                               
      emit this->SendTextChanged(_str, index);
    }
     
    TabWindow::~TabWindow()
    {
    }
    Je vous remercie d'avance pour vos réponse constructive.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 090
    Points
    43 090
    Par défaut
    J'ai une solution.


    Tu "connect" tous tes QLineEdit via le signal textChanged() à un slot de ta création qui sera en charge du traitement.

    Dans ce slot, tu lances QObject::sender(); qui te retourne le QObject ayant déclenché l'appel, tu cast celui-ci en QLineEdit et tu peux ainsi récupérer son contenu.

    Pour identifier l'appelant, tu peux appliquer à chaque QLineEdit la fonction setObjectName("nom objet');

    A partir du slot, la fonction objetName du QLineEdit casté te retournera son nom. Si en nom d'objet tu mets 0,1,2,3 etc. tu récupère en int via la fonction .toInt() par exemple, tu as alors le numéro de ligne concerné.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

    Une autre solution est l'utilisation d'une lambda C++11 dans laquelle tu captures l'indice (+this pour pouvoir appeler la méthode) et retransmets le QString du signal textChanged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        QLineEdit * lineEdit = new QLineEdit; // autant utiliser directement la variable lineEdit 
                                              // plutôt que d'avoir plusieurs accès at()
        // ...
        connect(lineEdit,
                &QLineEdit::textChanged,
                [index,this](QString const & str) {
                    ReceiveTextChanged(str, index);
        });
        LineGeneralData.push_back(lineEdit);
    Remarques :
    • Une raison particulière d'utiliser un pointeur sur QList<QLineEdit*> ?
    • Concernant ce code, et le messages que tu reçois :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
            QObject::connect(LineGeneralData->at(index), SIGNAL(SendTextChanged(const QString &, int)),
                             LineGeneralData->at(index), SLOT(ReceiveTextChanged(const QString &, int)));
      Tes LineGeneralData->at(index) sont des QLineEdit*, et si tu regardes leur documentation, le signal qu'ils envoient est :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      void textChanged(const QString & text)
      et non void SendTextChanged(const QString &, int index);.
      À l'identique pour le slot, c'est ta classe TabWindow qui possède le slot ReceiveTextChanged et non tes QLineEdit, LineGeneralData->at(index) est à remplacer par this (ou à omettre)

    Si tu souhaites réellement avoir un QLineEdit avec de tels signaux/slots, il te faudra hériter de cette classe, et utiliser ta nouvelle classe en héritant à la place de QLineEdit.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie pour vos réponses une nouvelle fois.

    Je pense utiliser la solution de chrtophe, qui me semble la plus simple.

    Je ne connaissais pas la lambda c++11 mais cela a l'air d'être intéressant, je vais me renseigner sur ce genre d'utilisation.

    Pour ce qui est des pointeurs je n'ai pas vraiment de raison particulière pour cette variable(pour le moment) mais c'est plus une habitude que j'ai, lorsque j'utilise des listes.

    Du coup pour conclure le sujet, je ne comprends pas pourquoi dans mon cas la création de mon signal personnel ne fonctionne pas, est ce parce que je n'hérite pas de la classe QLineEdit comme tu me l'a proposé Winjerome?

  5. #5
    Invité
    Invité(e)
    Par défaut
    La méthode connect() a, pour rester simple ses paramètres ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(sender, SIGNAL,
            receiver, SLOT)
    à mettre en parallèle avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          QObject::connect(LineGeneralData->at(index), SIGNAL(SendTextChanged(const QString &, int)),
                           LineGeneralData->at(index), SLOT(ReceiveTextChanged(const QString &, int)));
    avec
    • sender l'objet qui envoi son SIGNAL
    • receiver l'objet qui reçoit le signal et exécute son SLOT

    Comme j'ai essayé de te le faire comprendre, c'est ta classe TabWindow qui a les deux signaux et slots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void ReceiveTextChanged(const QString &, int index); 
    void SendTextChanged(const QString &, int index);
    ce ne sont pas tes QLineEdit.

    Ce que toi tu souhaites faire, c'est intercepter l'édition de tes QLineEdit, en ressortir la nouvelle chaine rentrée, et l'indice du QLineEdit associé, et exécuter ton slot ReceiveTextChanged() de ta classe TabWindow (=receiver) prenant ces deux paramètres.
    Les QLineEdit signalent que leur contenu a été modifié par l'émission de leur propre signal textChanger. Et c'est ce même signal qu'il faut connecter soit au slot du QSignalMapper, comme suggéré par chrtophe, soit à ma lambda.

    Question de goût, mais la solution de la lambda est clairement la plus simple à mes yeux.
    Dernière modification par Invité ; 21/11/2014 à 20h56.

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    D'accords, j'ai tilté !!!

    Encore merci à vous deux pour votre temps de réponse et leur contenue, peut être à une prochaine discussion!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. connect: No such slot
    Par scoutiste dans le forum Débuter
    Réponses: 6
    Dernier message: 05/09/2013, 16h13
  2. Réponses: 0
    Dernier message: 27/10/2010, 01h37
  3. Connexion SIGNAL / SLOT (No such signal)
    Par ero-sennin dans le forum Débuter
    Réponses: 1
    Dernier message: 22/10/2009, 15h26
  4. QObject::connect: No such slot
    Par guepe dans le forum Qt
    Réponses: 2
    Dernier message: 22/12/2005, 10h24
  5. Qt::connect: no such slot ...
    Par fdrouhin dans le forum Qt
    Réponses: 8
    Dernier message: 02/12/2004, 19h11

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