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

Qt Discussion :

impossible d'émettre un signal


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur en électronique
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut impossible d'émettre un signal
    Bonjour,

    Je développe une application avec Qt4.3.2 sous linux. Voici un extrait du code ci-dessous.

    Tout d'abord le fichier cpp :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <QtGui>
     
    #include "DomComptes.h"
    #include "VueComptes.h"
     
    CVueComptes::CVueComptes(CDomComptes *ptComptes)
    {
    	QTreeWidgetItem *ptItem;
     
    	if (ptComptes != 0) {
     
    		connect(this, SIGNAL(currentItemChanged(*ptCurrent, *ptPrevious)),this, SLOT(updateSelectedCompte(*ptCurrent, *ptPrevious)));
     
    		m_ptComptes = ptComptes;
     
    		setColumnCount(1);
    		header()->hide();
    		ptItem = new QTreeWidgetItem(this);
     
    		ptItem->setText(0, tr("Livre des Comptes"));
     
    		installComptes(ptItem);
    	}
    }
     
    void CVueComptes::installComptes(QTreeWidgetItem *ptParent)
    {
    	QTreeWidgetItem	*ptItemCompte;
    	QTreeWidgetItem 	*ptItemInfo;
    	CInfoCompte		infoCompte;
     
    	m_ptComptes->firstCompte(infoCompte);
    	while (!infoCompte.isEmpty()) {
    		qDebug() << "## Fonction installComptes ## : " << infoCompte.nomCompte() << " " << infoCompte.nombreOperations() << " " << infoCompte.soldeCourant();
     
    		ptItemCompte = new QTreeWidgetItem(ptParent);
    		ptItemCompte->setText(0, tr("%1").arg(infoCompte.nomCompte()));
     
    		ptItemInfo = new QTreeWidgetItem(ptItemCompte);
    		ptItemInfo->setText(0, tr("Nombre d'opérations = %1").arg(infoCompte.nombreOperations()));
     
    		ptItemInfo = new QTreeWidgetItem(ptItemCompte);
    		ptItemInfo->setText(0, tr("Solde courant = %1").arg(infoCompte.soldeCourant(), 0, 'f', 2));
     
    		m_ptComptes->nextCompte(infoCompte);
    	}
     
    	ptItemCompte = ptParent->child(0);
    	qDebug() << "## Fonction installComptes ## : " << ptItemCompte->text(0);
     
    	setCurrentItem (ptItemCompte);
    	emit currentItemChanged(ptItemCompte, ptItemCompte);
    	qDebug() << "## Fonction installComptes ## : Current Item = " << currentItem()->text(0); 
    }
     
    void CVueComptes::updateSelectedCompte(QTreeWidgetItem *ptCurrent, QTreeWidgetItem *ptPrevious)
    {
    	CInfoCompte infoCompte;
     
    	qDebug() << "## Fonction updateSelectedCompte ## : ";
     
    	if (ptCurrent != 0) {
    		infoCompte.setNomCompte(ptCurrent->text(0));
    		emit selectedCompteChanged(infoCompte);
    	}
    }
    Et maintenant le fichier .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
    #ifndef __VUE_COMPTES_H__
    #define __VUE_COMPTES_H__
     
    #include <QObject>
    #include <QTreeWidget>
     
    #include "InfoCompte.h"
     
    class QTreeWidgetItem;
    class CDomComptes;
     
    class CVueComptes : public QTreeWidget
    {
        Q_OBJECT
     
    private :
    	CDomComptes *m_ptComptes;
     
    public :
    	CVueComptes(CDomComptes *ptComptes);
     
    private :
    	void installComptes(QTreeWidgetItem *ptParent);
     
    signals :
    	void selectedCompteChanged(CInfoCompte infoCompte);
     
    public slots :
    	void updateSelectedCompte(QTreeWidgetItem *ptCurrent, QTreeWidgetItem *ptPrevious);
    };
     
    #endif
    1er problème :
    Quand je lance l'exécution du code j'obtiens dans la console de debug le message suivant :
    Object::connect: No such signal CVueComptes::selectedCompteChanged(infoCompte)
    alors que la fonction est déclarée dans la classe CVueComptes. Je ne comprends pas.
    2ème problème :
    Même si dans la fonction installComptes il y a la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emit currentItemChanged(ptItemCompte, ptItemCompte);
    il semble que le signal ne soit pas émis car la fonction
    void CVueComptes::updateSelectedCompte(QTreeWidgetItem *ptCurrent, QTreeWidgetItem *ptPrevious)
    qui lui attachée n'est pas exécuté puisque le commentaire que je demande d'afficher dans la console ne s'affiche pas.

    En résumé :
    J'ai l'impression que les connections (signals, slots) ne fonctionnent pas. Est-ce que j'ai oublié quelque chose ?

    Une personne peut m'aider ?

    Par avance merci.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    bonjour,
    utilise tu moc sur ton, .h??
    comment compile tu ?

  3. #3
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Pour le deuxième problème, ta connexion n'est pas correcte, dans les macros SIGNAL et SLOT il ne faut pas utiliser des noms de variables mais des types.
    Il faut plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
             this, SLOT(updateSelectedCompte(QTreeWidgetItem*, QTreeWidgetItem*)));
    De plus, il faut aussi déclarer currentItemChanged comme un signal de la classe CVueComptes, sinon ça ne marchera pas.

    Pour le premier problème, je ne sais pas trop, ça doit venir du moc qui n'a eut-être pas été fait assez récemment ?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur en électronique
    Inscrit en
    Novembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 24
    Par défaut
    Bonjour,

    Effectivement, après avoir fait des recherches supplémentaires je suis arrivé à la même conclusion que kinji1.

    Pour le premier problème c'est la même solution.

    En résumé dans les déclarations de SIGNALS et SLOTS il faut mettre les noms de type et non pas les noms de variables comme j'avais fait précédemment.

    Merci à tous pour d'autres aventures.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Lio,
    Citation Envoyé par jppaysan Voir le message
    Bonjour,

    Effectivement, après avoir fait des recherches supplémentaires je suis arrivé à la même conclusion que kinji1.

    Pour le premier problème c'est la même solution.

    En résumé dans les déclarations de SIGNALS et SLOTS il faut mettre les noms de type et non pas les noms de variables comme j'avais fait précédemment.

    Merci à tous pour d'autres aventures.
    En regardant la doc et les tutos, tu l'aurais su.

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

Discussions similaires

  1. impossible de mettre à jour recordset
    Par zephyr59 dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2016, 10h02
  2. [HTML] Problème avec DIV, impossible de mettre la hauteur à 100% !!
    Par keyser.greg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 01/03/2007, 11h46
  3. Impossible de mettre a jour les plans de maintenance
    Par sqlakf76 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/11/2006, 18h06
  4. Impossible de mettre à jour un champs
    Par _developpeur_ dans le forum Access
    Réponses: 4
    Dernier message: 23/01/2006, 13h17
  5. Réponses: 6
    Dernier message: 14/02/2003, 16h52

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