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 :

Impossible de changer une valeur avec les signaux et les slots

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Impossible de changer une valeur avec les signaux et les slots
    Bonjour,

    Je débute Qt depuis peu et là je suis soumis çà un problème que je n'arrive pas du tout à résoudre. J'ai déjà regardé sur la FAQ, rien à y faire.

    Le projet est le suivant :
    je crée une fenêtre avec des onglets.
    Dans le premier il y a un QComboBox,
    Et dans le deuxième onglet, je veux faire apparaitre une image qui dépend de l'item choisi.

    Je connecte le choix de l'item avec un SLOT (que j'ai créé) qui me sort le chemin de l'image à enregistré, là tout va bien.
    Sauf que l'image ne s'affiche pas !!!!

    je pense que c'est lié au faite que le programme est lue une seule fois et que les SIGNAL/SLOT ne modifient que des infimes parties de ceux-ci(seul les parties qui ont été prévus pour le changement)
    OU
    peut-être que si dans mon SLOT je pouvais avoir accès à l'instance de ma classe "mère" QWidget, je pourrais directement modifier celle-ci.
    Bref je suis un peu perdu, et j'espère que vous comprenez ma problématique.

    Assez bavardé, voici le code en version simplifier

    La classe QSSCheckBox me sert à créer des SLOT/SiGNAL pour autre chose aussi.(je sais que le nom est pas TOP mais bon)
    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
     
    //Le main.cpp
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        QWidget fenetre;
     
        // 1 : Créer le QTabWidget
        QTabWidget *onglets = new QTabWidget(&fenetre);
        onglets->setGeometry(30, 20, 320, 200);
     
        // 2 : Créer les pages, en utilisant un widget parent pour contenir chacune des pages
        QWidget *page1 = new QWidget;
        QWidget *page3 = new QWidget;
     
     
        // 3 : Créer le contenu des pages de widgets
     
            // Page 1
     
            QLineEdit *m_nomPerso = new QLineEdit("Entrez votre nom");
            QComboBox *m_type = new QComboBox();
            m_type->addItem("..............");
            m_type->addItem("Guerrier");
            m_type->addItem("Mage");
     
            QVBoxLayout *vbox1 = new QVBoxLayout;
            vbox1->addWidget(m_nomPerso);
            vbox1->addWidget(m_type);
     
            page1->setLayout(vbox1);
     
     
            // Page 3
     
            QSSCheckBox *aaa = new QSSCheckBox;
     
            QObject::connect(m_type,SIGNAL(activated (QString)),aaa,SLOT(immagePerso(QString)));
     
     
            QLabel *avatar = new QLabel;
            avatar->setPixmap(aaa->getNomImage());
            avatar->setAlignment(Qt::AlignCenter);
     
            QPushButton *boutonpret = new QPushButton("Prêt");
     
            QVBoxLayout *finpage3 = new QVBoxLayout;
            finpage3->addWidget(avatar);
            finpage3->addWidget(boutonpret);
     
            page3->setLayout(finpage3);
     
     
        // 4 : ajouter les onglets au QTabWidget, en indiquant la page qu'ils contiennent
        onglets->addTab(page1, "Perso");
        onglets->addTab(page3, "Image");
     
        //QObject::connect(aaa,SIGNAL(changeFenetre ()),page3,SLOT(show()));
     
        QObject::connect(boutonpret,SIGNAL(pressed()),qApp,SLOT(quit()));
     
     
        fenetre.show();
     
        return app.exec();
    }
    Puis la classe
    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
     
    // Le header
    class QSSCheckBox : public QCheckBox
    {
        Q_OBJECT
    public:
        explicit QSSCheckBox(QWidget *parent = 0);
        QString getNomImage () const ;
     
    signals:
        void changeFenetre() const;
     
    public slots:
        void immagePerso (QString);
     
    private :
        QString m_nomImage;
     
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Le cpp
    void QSSCheckBox::immagePerso (QString nomImage)
    {
        m_nomImage.clear();
        m_nomImage = "imagesPerso/" + nomImage + ".jpg";
     
        emit changeFenetre ();
     
    }
    Les lignes "importantes" dans le main:
    49 : connexion,
    59 : commentaire car marche pas


    Voili voilou
    J'espère avoir été assez claire, je n'hésiterais pas à reformuler mes propos.
    Merci pour votre aide

    Bonne nuit

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avatar->setPixmap(aaa->getNomImage());
    Ceci doit forcément être rappelé dans le slot que tu feras (connecté à changeFenetre()), il n'y a rien de dynamique, setPixmap lit seulement le paramètre à l'instant où il est appelé pour créer l'image.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je suis d'accort avec toi.
    Mais si j'écris le code suivant dans l'implémentation du SLOT immagePerso [3eme code - ligne 3] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_avatar.setPixmap(QPixmap(m_nomImage));
        m_avatar.show();
    Je charge bien une nouvelle image mais mon problème persiste. En effet, je ne sais pas comment dire à mon programme de remplacer l'image par la nouvelle.

    J'ai surement un problème d'organisation de mon programme et/ou d'esprit.

    J'aperçois le problème, il faut que je renvoie mon image dans l'onglet3 mais comme je suis dans une fonction, je "ne connais rien" de tous les autres paramètres.
    Faut-il que je passe par des amis?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    C'est sûr qu'il faudrait revoir un peu tout, je ne sais pas où tu as appris à travailler dans le main.

    Concrètement ce que tu es obligé de customiser (et je pense que c'est ce qu'on voit dans la plupart des tutoriels Qt, et même quand tu crées un squelette de projet dans Qt Creator), c'est la fenêtre principale. Là tu utilises un simple QWidget. Comme c'est ton conteneur, c'est lui qui va gérer le lien entre tous ses composants, ce code ne devrait pas être dans le main.

    QSSCheckBox, je n'ai pas compris. Tu sais ce que c'est une checkbox (case à cocher) ? Là tu t'en sers comme une classe non graphique. De toute façon tu n'en as pas besoin, soit tu gères le signal de la combobox dans ta fenêtre principale, soit directement dans l'onglet (widget custom), voire dans un QLabel custom (les connexions sont de toute façon à faire dans le constructeur de la fenêtre principale).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    C'est vrai qu'en découpant plus proprement son programme, on y arrive.
    Il faut juste penser à mettre en attribut les données/valeurs qui peuvent évoluer via les SLOT (pour pouvoir les appeler) - dans mon cas m_avatar.

    Merci à toi Troudhyl

    Le code pour la correction complète

    le .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
     
    #ifndef FENCHOIXPERSO_H
    #define FENCHOIXPERSO_H
     
    #include <QWidget>
    #include <QLabel>
    #include <QTabWidget>
     
     
     
    class FenChoixPerso : public QWidget
    {
        Q_OBJECT
    public:
        explicit FenChoixPerso(QWidget *parent = 0);
     
    signals:
     
    public slots:
        void slotAvatar (QString);
     
     
    private:
        QLabel *m_avatar;
     
    };
     
    #endif // FENCHOIXPERSO_H
    Le . 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
    67
    68
    69
    70
    71
    72
    73
    74
    #include "fenchoixperso.h"
    #include <QTabWidget>
    #include <QLineEdit>
    #include <QVBoxLayout>
    #include <QPushButton>
    #include <QComboBox>
    #include <QApplication>
     
     
     
    FenChoixPerso::FenChoixPerso(QWidget *parent) :
        QWidget(parent)
    {
        // 1 : Créer le QTabWidget
        QTabWidget *onglets = new QTabWidget(this);
        onglets->setGeometry(30, 20, 320, 200);
     
        // 2 : Créer les pages, en utilisant un widget parent pour contenir chacune des pages
        QWidget *page1 = new QWidget;
        QWidget *page3 = new QWidget;
     
     
        // 3 : Créer le contenu des pages de widgets
     
            // Page 1
     
            QLineEdit *m_nomPerso = new QLineEdit("Entrez votre nom");
            QComboBox *m_type = new QComboBox();
            m_type->addItem("..............");
            m_type->addItem("Guerrier");
            m_type->addItem("Mage");
     
            QVBoxLayout *vbox1 = new QVBoxLayout;
            vbox1->addWidget(m_nomPerso);
            vbox1->addWidget(m_type);
     
            page1->setLayout(vbox1);
     
     
            // Page 3
     
     
            m_avatar = new QLabel;
            m_avatar->setPixmap(QPixmap("imagesPerso/mage.jpg"));
            m_avatar->setAlignment(Qt::AlignCenter);
     
            QPushButton *boutonpret = new QPushButton("Prêt");
     
            QVBoxLayout *finpage3 = new QVBoxLayout;
            finpage3->addWidget(m_avatar);
            finpage3->addWidget(boutonpret);
     
            page3->setLayout(finpage3);
     
            QObject::connect(m_type,SIGNAL(activated (QString)),this,SLOT(slotAvatar(QString)));
     
     
        // 4 : ajouter les onglets au QTabWidget, en indiquant la page qu'ils contiennent
        onglets->addTab(page1, "Perso");
        onglets->addTab(page3, "Image");
     
        QObject::connect(boutonpret,SIGNAL(clicked()),qApp,SLOT(quit()));
     
    }
     
    void FenChoixPerso::slotAvatar (QString nomImage)
    {
        nomImage = "imagesPerso/" + nomImage + ".jpg";
     
        m_avatar->setPixmap(QPixmap(nomImage));
        //m_avatar->show();
     
     
    }
    Le main.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
     
    #include "fenchoixperso.h"
     
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        FenChoixPerso fenetre;
     
        fenetre.show();
     
     
        return app.exec();
    }

Discussions similaires

  1. [QThread] Thread travailleur avec Qt en utilisant les signaux et les slots
    Par dourouc05 dans le forum Multithreading
    Réponses: 1
    Dernier message: 19/03/2012, 10h06
  2. [Reflection] Impossible de transmettre une valeur null avec method.invoke
    Par touftouf57 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 02/07/2010, 03h42
  3. Impossible de prendre une valeur avec Console.Read( ?
    Par Tux1 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 07/01/2007, 16h29

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