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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 774
    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 774
    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é...

+ 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