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 :

Slots d'un widget : 'no such signal'

  1. #1
    Candidat au Club
    Homme Profil pro
    médecin retraité, ex resp. de dept d'information medicale
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : médecin retraité, ex resp. de dept d'information medicale
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Slots d'un widget : 'no such signal'
    bonjour,
    j'ai installé QT depuis les dépôts officiels ubuntu, en mai dernier. La version de QTcreator est fixée à 3.5.1, mais donne bien accès aux fonctionnalités de QT5 , et aux objets widget correspondants, correction tardive après résolution du post:
    non, quoique QTCreator 3.5.1 soit, je suppose, adapté à traiter les fonctionnalités de QT5, tel que c'est installé chez moi, il donne accès exclusivement aux fonctionnalités QT4 - ce qui est déjà pas si mal pour cet EDI très complet....

    si j'en crois le 'à-propos' de l'aide de creator: ça affiche "QTCreator 3.5.1. Basé sur Qt 5.5.1 (GCC 5.2.1 20151129, 64 bit)

    Depuis Creator, on peut seulement accéder à l'environnement desktop (ça me suffit) et créer des applications "qt avec widget" et "console'.
    J'ai mis un certain temps à me familiariser avec ..... et actuellement j'ai une "appli avec widget" constituée d'une fenêtre principale + des widgets enfants dedans, et une appli perso tournant dans un thread séparé.
    Donc liens entre les 2 par signals et slots.
    j'utilise toujours la syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(&Objet1,SIGNAL (unsignal(...)),&Objet2, SLOT (unslot(...));
    la plupart des connect sont écrits dans le constructeur de la fenêtre .



    Que le signal soit déclaré et émis par une fonction tournant dans le thread séparé (tournant dans mainwindow.cpp pour la boucle principale, ou dans les autres .cpp)
    ou que le signal soit émis par un QPushbutton de la mainwindow, (donc un signal pré-défini et trouvé dans la doc QTAssistant).....
    ça communique bien avec le slot (d'un autre widget, ou fonction d'un objet déclaré dans mon code)

    Le problème: les signaux censés être émis par le widget QListWidget donnent en exécution le message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->Parametres_listWidget,SIGNAL(  (itemClicked ( QListWidgetItem )) ,&the_editParams,SLOT(getclickedlineParam(QListWidgetItem)));
    retour d'exécution:
    Object::connect: No such signal QListWidget::itemClicked ( QListWidgetItem ) in ../ebauche-0/mainwindow.cpp:57
    Object::connect: (sender name: 'Parametres_listWidget')
    J'ai essayé tous les signals de cette damnée QListwidget, aucun de ceux qui renvoient un ListWidgetitem n'est reconnu!.

    rem: dans le fichier usr/lib/qt4/qt/ qlistwidget.h il y a bien un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Q_SIGNALS:
        void itemPressed(QListWidgetItem *item);
        void itemClicked(QListWidgetItem *item);
    pas d'incohérence entre la doc et les en-tête, je n'ai pas inventé le signal....

    Avez-vous une piste?
    merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Comme tu l'as très bien vu, tu as les signaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        void itemPressed(QListWidgetItem *item);
        void itemClicked(QListWidgetItem *item);
    qui prennent en paramètre un QListWidgetItem * (avec étoile, un pointeur) et non pas un QListWidgetItem (par valeur).

    Étoile que tu te dois de reporter (en adaptant l'entrée de ton slot) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->Parametres_listWidget, SIGNAL(itemClicked(QListWidgetItem *)), &the_editParams, SLOT(getclickedlineParam(QListWidgetItem *)));
    À noter que l'utilisation des macros SIGNAL/SLOT est obsolète, on utilise dorénavant des pointeurs sur fonctions (ou lambdas au besoin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->Parametres_listWidget, &QListWidget::itemClicked, &the_editParams, &TaClasseEditParams::getclickedlineParam);

  3. #3
    Candidat au Club
    Homme Profil pro
    médecin retraité, ex resp. de dept d'information medicale
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : médecin retraité, ex resp. de dept d'information medicale
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    maintenant le signal est accepté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->Parametres_listWidget,SIGNAL(  itemPressed ( QListWidgetItem * )) ,&the_editParams,SLOT(getclickedlineParam(const QListWidgetItem*)));/
    Pas malin, j'avais enlevé et le nom de la variable.... et l'indication que c'est un pointeur.....
    maintenant j'ai aussi modifié la déclaration du slot (item1 devrait devenir 1 pointeur sur le objet de type QListWidgetItem).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class EditParams: public QObject
     {Q_OBJECT
    public:
        void test();
    public slots:
        void getText(const QString texte);  //   <- lineEdit   :   récupère après édition Parametres_lineEdit.text()
        void  getclickedlineParam(const QListWidgetItem *item1);//<- itemClicked ( QListWidgetItem * )/
    Seulement en exécution j'ai le message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QObject::connect: Incompatible sender/receiver arguments
            QListWidget::itemPressed(QListWidgetItem*) --> EditParams::getclickedlineParam(const QListWidgetItem*)
    Il y a encore un lézard, mais lequel cette fois?
    je m'y perds....

    Par ailleurs, j'avais renoncé à utiliser la nouvelle syntaxe, suite à des messages d'erreur ne reconnaissant pas les fonctions signal et slot.... et j'avais lu quelque part que
    les déclarations des objets à connecter DOIVENT apparaître juste avant l'instruction de connexion.....

  4. #4
    Candidat au Club
    Homme Profil pro
    médecin retraité, ex resp. de dept d'information medicale
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : médecin retraité, ex resp. de dept d'information medicale
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    autant pour moi.... c'est que j'avais mis en const l'argument du slot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->Parametres_listWidget,SIGNAL( itemPressed ( QListWidgetItem * )) ,&the_editParams,SLOT(getclickedlineParam(const QListWidgetItem*)));
    alors que le signal n'émet pas une constante....
    j'ai corrigé..... et pas de message d'erreur maintenant. Merci à toi...

    cependant ça ne dit pas pourquoi la nouvelle syntaxe coince:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(ui->Parametres_lineEdit,&QLineEdit::returnPressed(),ui->Parametres_listWidget,&QListWidget::clear());
    //connect(ui->Parametres_lineEdit,SIGNAL( returnPressed ()),ui->Parametres_listWidget,SLOT (clear()));
    par contre la même instruction (en commentaire dessous) est acceptée et est efficace, !
    voici les messages
    /home/hubert/projets-c/ebauche-0/mainwindow.cpp:63: erreur : cannot call member function 'void QLineEdit::returnPressed()' without object
     connect(ui->Parametres_lineEdit,&QLineEdit::returnPressed(),ui->Parametres_listWidget,&QListWidget::clear());
    /home/hubert/projets-c/ebauche-0/mainwindow.cpp:63: erreur : cannot call member function 'void QListWidget::clear()' without object
     connect(ui->Parametres_lineEdit,&QLineEdit::returnPressed(),ui->Parametres_listWidget,&QListWidget::clear());
    (pour la petite histoire, j'ai omis le () à returnPressed()..... et alors le compilateur a, je crois, confondu avec la variable protégée "returnPressed" ....... )

  5. #5
    Invité
    Invité(e)
    Par défaut
    Si tu regardes bien la ligne que j'ai fournie, je n'ai justement pas mis de parenthèses (au signal comme au slot)
    On n'appelle pas de fonction à ce niveau, on ne fait que passer leur adresse. Ce n'est que lors de l'émission du signal que ton slot sera appelé.

    Et oui, avec les macros SIGNAL/SLOT les paramètres du signal et du slot doivent correspondre exactement, contrairement à cette nouvelle syntaxe qui autorise parfaitement la conversion implicite (telle que ton ajout du const).

    Citation Envoyé par bounoume Voir le message
    Par ailleurs, j'avais renoncé à utiliser la nouvelle syntaxe, suite à des messages d'erreur ne reconnaissant pas les fonctions signal et slot.... et j'avais lu quelque part que
    les déclarations des objets à connecter DOIVENT apparaître juste avant l'instruction de connexion.....
    Non, rien n'y oblige. Tant qu'ils le sont, peu importe l'endroit où ils sont déclarés (et initialisés).

  6. #6
    Candidat au Club
    Homme Profil pro
    médecin retraité, ex resp. de dept d'information medicale
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : médecin retraité, ex resp. de dept d'information medicale
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    décidément ça veut pas....
    j'ai re-essayé en espérant avoir la bonne syntaxe.....
    voici le code donné à compiler (et, en commentaire, avec l'ancienne syntaxe, lui, accepté sans erreur de compil ni d'exec...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    connect(ui->Parametres_listWidget,&QListWidget::itemPressed,&the_editParams,&EditParams::getclickedlineParam);
     
    //connect(ui->Parametres_listWidget,SIGNAL(  itemPressed ( QListWidgetItem * )) ,&the_editParams,SLOT(getclickedlineParam( QListWidgetItem*)));
    et les messages d'erreur:
    /usr/include/qt4/QtGui/qlistwidget.h:264: 
           erreur : 'void QListWidget::itemPressed(QListWidgetItem*)' is protected
           void itemPressed(QListWidgetItem *item);
    
    /home/hubert/projets-c/ebauche-0/mainwindow.cpp:66:
           erreur : within this context
           connect(ui->Parametres_listWidget,&QListWidget::itemPressed,&the_editParams,&EditParams::getclickedlineParam);
    
    /home/hubert/projets-c/ebauche-0/mainwindow.cpp:66: erreur :
          no matching function for call to 'MainWindow::connect(QListWidget*&, void (QListWidget::*)(QListWidgetItem*), EditParams*, void (EditParams::*)(QListWidgetItem*))'
          connect(ui->Parametres_listWidget,&QListWidget::itemPressed,&the_editParams,&EditParams::getclickedlineParam);
    
    le premier message ('is protected') me semble étrange...

  7. #7
    Invité
    Invité(e)
    Par défaut
    D'après la première ligne de l'erreur, tu ne travailles pas avec une version Qt5, mais Qt4 où les signaux sont protected alors qu'ils sont public dans Qt5. C'est ce qui est à l'origine de l'erreur.
    Soit (pas le choix) tu gardes l'ancienne syntaxe, soit tu utilises une version Qt à jour (actuellement Qt 5.12).

  8. #8
    Candidat au Club
    Homme Profil pro
    médecin retraité, ex resp. de dept d'information medicale
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : médecin retraité, ex resp. de dept d'information medicale
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Voilà l'explication.
    Version 4 donc pas encore la nouvelle syntaxe de connect.
    Effectivement je n'ai guère de choix, puisque j'utilise la distribution free provenant des dépôts ubuntu, et effectivement les répertoires de mon système font effectivement référence à QT4 uniquement. J'avais cru le 'about' de QTCreator qui dit être 'basé sur' QT5 .

    merci donc, .... et probablement à bientôt.....

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/11/2014, 21h40
  2. Créer un widget avec un signal ?
    Par info_sara dans le forum Débuter
    Réponses: 5
    Dernier message: 23/05/2012, 00h01
  3. Réponses: 0
    Dernier message: 27/10/2010, 01h37
  4. Connexion SIGNAL / SLOT (No such signal)
    Par ero-sennin dans le forum Débuter
    Réponses: 1
    Dernier message: 22/10/2009, 15h26

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