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 :

Signal/slot avec attributs différents

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut Signal/slot avec attributs différents
    Bonsoir,

    J'ai cru comprendre que les attributs fournis aux signaux et slots doivent être du même type.

    Ainsi, cette ligne de code fonctionne (à la fin de l'édition de la ligne, la fenêtre qui la contient est fermée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::connect(&ligne,SIGNAL(editingFinished()),&fenetre,SLOT(close()));
    Et si je veux maintenant qu'à la fin de l'édition, le nom de ma fenêtre soit changée par le contenu de ma ligne ? Intuitivement, je fais ça, mais ça ne marche pas (à mon avis parce que le signal n'a pas d'attribut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::connect(&ligne,SIGNAL(editingFinished()),&fenetre,SLOT(setWindowTitle(ligne.displayText())));
    Comment faut-il faire pour arriver au résultat voulu ?

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut


    Quand tu connectes des signaux, tu ne prévois que les types qui seront envoyés. Là, tu tentes de forcer des données à un signal, ce qui ne se fait que lors de son émission.

    Petite comparaison : imagine deux indiens, chacun sur son pilier, avec un feu de camp. L'un va regarder dans la direction de l'autre pour voir si un certain signal est émis (éboulement dans la région, il faut décamper dans une certaine direction). C'est un parallèle pour la connexion de signaux et de slots. Il est illogique à ce moment-là de définir qu'il faudra partir vers l'est, cela ne sera réellement défini que quand l'éboulement aura lieu et qu'il faudra effectivement décamper.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    que dois je faire alors : créer une classe dérivée de QLigneEdit avec signal personnalisé qui reprend le editingFinished() en lui ajoutant un attribut QString ?

    j'aurais donc un indien qui envoie un signal 'eboulement("est")' et un autre indien qui déclenche le slot fuirEboulement("est") ?

    PS : si je dis des conneries, c'est normal, je suis en pleine découverte des 2 bidules (le bidule C++ et le bidule Qt)


    EDIT : ou surement plus simple, un slot personnalisé dans une classe dérivé de QWidget, qui contient simplement un setWindowTitle(ligne.displayText()). Le problème est la portée de la ma variable 'ligne'...

  4. #4
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    J'y suis presque arrivé

    J'ai juste un petit problème de pointeur pour faire passer un QString dans setWindowTitle.

    C'est ma ligne suivante (n°23 dans mon code complet) qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::setWindowTitle(m_QLineEditASurveiller);
    On me demande de passer un adresse (&), et le message d'erreur me dit que je lui passe un truc bizarre (*&) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.cpp:23: error: no matching function for call to ‘FenetreTitreVariable::setWindowTitle(QLineEdit*&)
    Voici le code complet :
    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
    #include <QApplication>
    #include <QTextCodec>
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
     
    class FenetreTitreVariable : public QWidget
    {
        Q_OBJECT
        public:
            FenetreTitreVariable(QLineEdit *QLineEditASurveiller);
        public slots:
            void captureQLineEdit();
        private:
            QLineEdit *m_QLineEditASurveiller;
    };
     
    FenetreTitreVariable::FenetreTitreVariable(QLineEdit *QLineEditASurveiller) : m_QLineEditASurveiller(QLineEditASurveiller)
    {}
     
    void FenetreTitreVariable::captureQLineEdit()
    {
    //    QWidget::setWindowTitle(m_QLineEditASurveiller);
        QWidget::setWindowTitle("test");
    }
     
    #include "main.moc"
    // afin de pouvoir utiliser une classe qui comprend la macro Q_OBJECT
    // sans avoir à mettre cette classe dans des .h et .cpp spécifiques
    // (à inclure APRÈS la classe en question)
    // Penser à refaire un qmake en cas d'erreur 'vtable'
     
    int main(int argc, char *argv[])
    {
        QApplication monApplication(argc, argv);
     
        // Pour l'affichage correct des caractères si le codage est fait en UTF-8
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
     
        QLineEdit *ligne(0);
        FenetreTitreVariable fenetre(ligne);
        fenetre.setWindowTitle("Fenetre et sa QLineEdit");
        fenetre.setFixedSize(350,100);
     
        QPushButton bouton("Effacer la ligne", &fenetre);
        bouton.move(25,25);
        bouton.resize(80,25);
     
        ligne = new QLineEdit("<-- cliquer pour effacer", &fenetre);
        ligne->move(125,25);
        ligne->resize(200,25);
     
        QWidget::connect(&bouton,SIGNAL(clicked()),ligne,SLOT(clear()));
    //    QWidget::connect(ligne,SIGNAL(textEdited(QString)),&fenetre,SLOT(setWindowTitle(QString)));
        QWidget::connect(ligne,SIGNAL(editingFinished()),&fenetre,SLOT(captureQLineEdit()));
     
        fenetre.show();
     
        return monApplication.exec();
    }

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 111
    Par défaut
    Bonjour,

    remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::setWindowTitle(m_QLineEditASurveiller);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setWindowTitle(m_QLineEditASurveiller->text());

  6. #6
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    Bonsoir,

    Merci pour ta réponse. Malheureusement, cela fait planter le programme quand je presse la touche Enter dans le champ du QLineEdit...

    Message d'erreur :
    Le programme s'est terminé subitement.
    /home/*****/Documents/Programmes/test-build-desktop/test s'est terminé avec le code 0


    EDIT : je ne connais pas vraiment, mais j'ai quand meme tenter de lancer le déboguage, et le message suivant apparait :
    L'inférieur a stoppé car il a reçu un signal du système d'exploitation.
    Nom du signal : SIGSEGV
    Signification du signal : Segmentation fault
    EDIT2 : en fait mon pointeur m_QLineEditASurveiller vaut 0x0 au moment du plantage... Donc l'adresse de mon QLineEdit ne lui a pas été passé...

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 111
    Par défaut
    c'est une violation de memoire, donc ton pointeur m_QLineEditASurveiller n'est pas initialisé.

  8. #8
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    Citation Envoyé par abdou57 Voir le message
    c'est une violation de memoire, donc ton pointeur m_QLineEditASurveiller n'est pas initialisé.
    Effectivement, l'affectation de mon pointeur se faisait après la construction de la fenêtre. Mais je ne pouvais pas la faire avant car j'avais besoin que la fenêtre existe pour la mettre comme parent du QLineEdit...

    Donc j'ai modifié ma classe pour ajouter le QLineEdit dans une surcharge de constructeur.

    Je n'ai plus d'erreur de compilation, mais la QLineEdit n'apparait plus dans ma fenêtre

    Pourquoi ?

    Voici le code actuel :
    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
    67
    #include <QApplication>
    #include <QTextCodec>
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
     
    class FenetreTitreVariable : public QWidget
    {
        Q_OBJECT
        public:
            FenetreTitreVariable();
            QLineEdit *ligne();
        public slots:
            void captureQLineEdit();
        private:
            QLineEdit m_ligne;
    };
     
    FenetreTitreVariable::FenetreTitreVariable()
    // surcharge du constructeur de QWidget qui ajoute une QLineEdit fille à la fenetre
    {
        QLineEdit m_ligne("<-- cliquer pour effacer",this);
        m_ligne.move(125,25);
        m_ligne.resize(200,25);
    }
     
    void FenetreTitreVariable::captureQLineEdit()
    // SLOT qui change le titre de la fenetre par le texte contenu dans m_ligne
    {
        setWindowTitle(m_ligne.text());
    }
     
    QLineEdit *FenetreTitreVariable::ligne()
    // retourne l'adresse mémoire de l'objet m_ligne de type QLineEdit
    {
        return &m_ligne;
    }
     
    #include "main.moc"
    // afin de pouvoir utiliser une classe qui comprend la macro Q_OBJECT
    // sans avoir à mettre cette classe dans des .h et .cpp spécifiques
    // (à inclure APRÈS la classe en question)
    // Penser à refaire un qmake en cas d'erreur 'vtable'
     
    int main(int argc, char *argv[])
    {
        QApplication monApplication(argc, argv);
     
        // Pour l'affichage correct des caractères si le codage est fait en UTF-8
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
     
        FenetreTitreVariable fenetre;
        fenetre.setWindowTitle("Fenetre et sa QLineEdit");
        fenetre.setFixedSize(350,100);
     
        QPushButton bouton("Effacer la ligne", &fenetre);
        bouton.move(25,25);
        bouton.resize(80,25);
     
        QWidget::connect(&bouton,SIGNAL(clicked()),fenetre.ligne(),SLOT(clear()));
    //    QWidget::connect(ligne,SIGNAL(textEdited(QString)),&fenetre,SLOT(setWindowTitle(QString)));
        QWidget::connect(fenetre.ligne(),SIGNAL(editingFinished()),&fenetre,SLOT(captureQLineEdit()));
     
        fenetre.show();
     
        return monApplication.exec();
    }

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

    Ici tu as deux variables m_ligne distinctes:

    Dans un premier temps tu dois déclarer m_ligne comme pointeur dans ton .h, et ensuite comme te l'a déjà suggéré abdou57, faire son initialisation dans ton constructeur.

  10. #10
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    J'ai cherché, et j'ai imaginer pointer sur un pointeur pour avoir l'adresse mémoire de ma ligne que je passe ensuite dans ma classe de fenêtre personnalisée qui peut donc l'utiliser à son tour au moment du déclenchement du slot pour récupérer la valeur pointé par le pointeur de QLineEdit lui meme pointé par mon pointeur de pointeur, et ... je me rend compte en lisant des trucs sur les pointeurs que je viens de réinventer le double pointeur C'est encore mieux que de l'avoir appris !

    Bon, voici le code source. Pouvez vous me dire si c'était la bonne solution, où s'il y a plus simple pour arriver au résultat voulu (à savoir : appuyer sur entrer dans le QLineEdit modifie le titre de la fenetre parente - et seulement lors de l'appui de la touche Entrée, pas dès qu'on modifie le texte en cours de frappe : ça c'est trop facile ) :
    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
    #include <QApplication>
    #include <QTextCodec>
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
     
    class FenetreTitreVariable : public QWidget
    {
        Q_OBJECT
        public:
            FenetreTitreVariable(QLineEdit **ligne);
        public slots:
            void captureQLineEdit();
        private:
            QLineEdit **m_ligne;
    };
     
    FenetreTitreVariable::FenetreTitreVariable(QLineEdit **ligne) : m_ligne(ligne)
    {}
     
    void FenetreTitreVariable::captureQLineEdit()
    // SLOT qui change le titre de la fenetre par le texte contenu dans ligne
    {
        QLineEdit *ligne(*m_ligne);
        setWindowTitle(ligne->text());
    }
     
    #include "main.moc"
    // afin de pouvoir utiliser une classe qui comprend la macro Q_OBJECT
    // sans avoir à mettre cette classe dans des .h et .cpp spécifiques
    // (à inclure APRÈS la classe en question)
    // Penser à refaire un qmake en cas d'erreur 'vtable'
     
    int main(int argc, char *argv[])
    {
        QApplication monApplication(argc, argv);
     
        // Pour l'affichage correct des caractères si le codage est fait en UTF-8
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
     
        QLineEdit *ligne(0);
        FenetreTitreVariable fenetre(&ligne);
        fenetre.setWindowTitle("Fenetre et sa QLineEdit");
        fenetre.setFixedSize(350,100);
     
        ligne = new QLineEdit("<-- cliquer pour effacer",&fenetre);
        ligne->move(125,25);
        ligne->resize(200,25);
     
        QPushButton bouton("Effacer la ligne",&fenetre);
        bouton.move(25,25);
        bouton.resize(80,25);
     
        QWidget::connect(&bouton,SIGNAL(clicked()),ligne,SLOT(clear()));
    //    QWidget::connect(ligne,SIGNAL(textEdited(QString)),&fenetre,SLOT(setWindowTitle(QString)));
        QWidget::connect(ligne,SIGNAL(editingFinished()),&fenetre,SLOT(captureQLineEdit()));
     
        fenetre.show();
     
        return monApplication.exec();
    }

  11. #11
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Dans un premier temps tu dois déclarer m_ligne comme pointeur dans ton .h, et ensuite comme te l'a déjà suggéré abdou57, faire son initialisation dans ton constructeur.
    Merci et désolé, je n'avais pas vu ton post.
    Du coup, sans m'être rendu compte de cette erreur, j'ai effectivement modifié en ce sens, mais en plus en utilisant un double pointeur comme expliqué dans mon post juste au dessus. On pouvait faire plus simple ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    Pourquoi utiliser un double pointeur? Un simple pointeur suffit, et c'est habituellement ce qu'on utilise.
    Je verrais plus le code du main se situer dans ton constructeur. Dans ta fonction captureQLineEdit pourquoi n'utilises-tu pas directement m_ligne?

    Au final, je verrais quelque chose comme:
    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
    class FenetreTitreVariable : public QWidget
    {
        Q_OBJECT
        public:
            FenetreTitreVariable(QWidget *parent = 0);
        public slots:
            void captureQLineEdit();
        private:
            QLineEdit *m_ligne;
    };
     
     
    FenetreTitreVariable::FenetreTitreVariable(QWidget *parent) : QWidget(parent) 
    {
        m_ligne = new QLineEdit("<-- cliquer pour effacer",this);
        setWindowTitle("Fenetre et sa QLineEdit");
        setFixedSize(350,100);
     
        m_ligne->move(125,25);
        m_ligne->resize(200,25);
     
        QPushButton *bouton = new QPushButton("Effacer la ligne",this);
        bouton->move(25,25);
        bouton->resize(80,25);
     
        connect(bouton,SIGNAL(clicked()),m_ligne,SLOT(clear()));
        connect(m_ligne,SIGNAL(editingFinished()),this,SLOT(captureQLineEdit()));
    }
     
    void FenetreTitreVariable::captureQLineEdit()
    // SLOT qui change le titre de la fenetre par le texte contenu dans ligne
    {
        setWindowTitle(m_ligne->text());
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(int argc, char *argv[])
    {
        QApplication monApplication(argc, argv);
     
        // Pour l'affichage correct des caractères si le codage est fait en UTF-8
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
     
        FenetreTitreVariable fenetre;
        fenetre.show();
     
        return monApplication.exec();
    }

  13. #13
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    Bonjour,

    Je n'ai pas réussi avec un pointeur simple et ma QLineEdit en dehors de la classe. J'avais toujours un message d'erreur lors du setWindowTitle m'indiquant que ma QString n'était pas au bon format)...

    Effectivement, c'est plus simple dans l'exemple que tu donnes, mais tout est encapsulé dans la classe.

    Mais je crois que j'ai mal posé mon problème initial, alors je réessaie : j'ai une fenêtre dont je veux pouvoir modifier le titre à la volée par l'intermédiaire d'un signal, par exemple lors de la validation d'un champ QLineEdit, mais ce pourrait être aussi à partir d'un autre type de variable...
    Donc après réflexion :
    - la fenêtre est la partie "constante" dans ma problématique : autant utiliser directement son slot setWindowTitle.
    - la QLineEdit (et/ou autre type d'objet contenant la QString à envoyer dans le titre) étant la partir "variable", il vaut mieux créer une classe dérivée cet objet, avec création d'un signal contenant une QString, à relier au slot setWindowTitle de la fenêtre

    Je vais essayer de faire ça...

  14. #14
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    J'ai enfin réussi

    Enfin, presque, car occasionnellement et de façon qui semble aléatoire, l'appui sur la touche Enter après une modification du texte ne provoque pas le changement de titre (pas de message d'erreur affiché dans QtCreator)...
    Encore une erreur dans le code ? Le voici :
    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
    #include <QApplication>
    #include <QTextCodec>
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
     
    class MaQLineEdit : public QLineEdit
    {
        Q_OBJECT
        public:
            MaQLineEdit(QWidget *parent = 0);
        signals:
            void emissionQString(QString);
        public slots:
            void declencheurEmissionQString();
    };
     
    MaQLineEdit::MaQLineEdit(QWidget *parent) : QLineEdit(parent)
    {
        // connection intermédiaire entre fin d'édition et envoi du QString
        QWidget::connect(this,SIGNAL(editingFinished()),this,SLOT(declencheurEmissionQString()));
    }
     
    void MaQLineEdit::declencheurEmissionQString()
    {
        // SIGNAL qui envoie le texte contenu dans ligne
        emit emissionQString(this->text());
    }
     
    #include "main.moc"
    // afin de pouvoir utiliser une classe qui comprend la macro Q_OBJECT
    // sans avoir à mettre cette classe dans des .h et .cpp spécifiques
    // (à inclure APRÈS la classe en question)
    // Penser à refaire un qmake en cas d'erreur 'vtable'
     
    int main(int argc, char *argv[])
    {
        QApplication monApplication(argc, argv);
     
        // Pour l'affichage correct des caractères si le codage est fait en UTF-8
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
     
        QWidget fenetre;
        fenetre.setWindowTitle("Fenêtre et sa QLineEdit");
        fenetre.setFixedSize(350,100);
     
        MaQLineEdit ligne(&fenetre);
        ligne.setText("<-- cliquer pour effacer");
        ligne.move(125,25);
        ligne.resize(200,25);
     
        QPushButton bouton("Effacer la ligne",&fenetre);
        bouton.move(25,25);
        bouton.resize(80,25);
     
        QWidget::connect(&bouton,SIGNAL(clicked()),&ligne,SLOT(clear()));
        QWidget::connect(&ligne,SIGNAL(emissionQString(QString)),&fenetre,SLOT(setWindowTitle(QString)));
     
        fenetre.show();
     
        return monApplication.exec();
    }
    Autre petite question, n'y a t'il pas un façon générique de surcharger TOUS les constructeurs d'un coup ?

    En tout cas merci beaucoup pour l'aide apportée !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/08/2014, 09h03
  2. Réponses: 2
    Dernier message: 20/01/2014, 22h05
  3. Problème avec un signal/slot
    Par scary dans le forum Qt
    Réponses: 12
    Dernier message: 11/12/2009, 21h20
  4. Signals et Slots avec QextSerialPort
    Par sardik dans le forum Qt
    Réponses: 1
    Dernier message: 05/05/2009, 17h30
  5. [JDOM] Ajout d'une balise avec un attribut différent.
    Par Nidel dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 27/04/2007, 19h36

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