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 de fermeture d'une boite de dialogue

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut Signal de fermeture d'une boite de dialogue
    Bonjour à tous,

    J'ai une boîte de dialogue avec une ComboBox et un bouton Valider. J'aimerai que quand je clique sur Valider je puisse récupérer la chaine de ComboBox sélectionné. Pour cela j'ai donc connecté le signal du bouton en envoyant la chaine à une méthode d'une autre classe qui gère la chaine.

    Voici le code :
    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
     
    NameDialog::NameDialog(Map *map, QWidget *parent) : QDialog(parent)
    {
        name_box = new QComboBox(this);
        ...
     
        close_button = new QPushButton(tr("Valider"),this);
     
        // Connection du signal
        QObject::connect(close_button, SIGNAL(clicked()), this, SLOT(WidgetMap::check_station()));
        // WidgetMap étant la classe qui possède le slot check_station
        // Comment faire pour que cette méthode puisse recevoir name_box->currentText ?
     
        vbox = new QVBoxLayout(this);
        vbox->addWidget(name_box);
        vbox->addWidget(close_button);
        setLayout(vbox);
    }
    Merci d'avance pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Bonjour

    Il me semble qu'il existe un SLOT qui permet d'indiquer que la fenêtre est en cours de fermeture.

    - Connecte le clique de ton bouton vers la fermeture de la fenetre.
    - Connecte la fermeture de la fenêtre vers la lecture de ta combo box.

    Si j'ai bien compris ton problème, je pense que ca devrait fonctionner.

    Cordialement,
    PKO
    Quand c'est trop, c'est pas bon !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    En fait j'ai finalement trouvé une autre technique, elle marche mais est-elle valable ?
    En gros je veux passer des paramètres entre widget, dans ce cas là c'est un QString correspondant à l'item sélectionné de la combobox, comme le widget à qui je veux donner cet argument est le widget parent je fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void NameDialog::button() // C'est la méthode appelé par le signal clicked du bouton de la boite de dialogue
    {
        WidgetMap *temp;
        temp = (WidgetMap*)(this->parentWidget());
        // Je cast avec ma classe que j'ai dérivée de QWidget
     
        temp->check_station(name_box->currentText());
        // Check_station est la méthode du widget parent WidgetMap
     
        // Fermeture de la boite de dialogue
        close();
    }
    Le problème est que ça marche si le widget parent est bien de type WidgetMap, si il ne l'est pas, que se passe t-il ? Plantage ?

    De toute façon ma boite de dialogue est toujours appelé par WidgetMap mais bon, n'y a t-il pas une autre solution plus valable ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    1- Qt fournie un méthode pour cela
    http://qt.developpez.com/doc/4.4/qinputdialog/#getitem

    2- Si tu utilise une QDialog, en principe tu utilise la fonction exec() pour l'afficher et un fois fermé tu peut récupérer ce que tu veut
    http://qt.developpez.com/doc/4.4/qdialog/#exec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
    maDialig diag;
    diag.exec();
     
    /*traitement de la réponse*/
    }
    3-Si tu n'utilise pas exec(), tu le considère comme une widget top level.

    Si je comprend bien ce que tu veut faire, tu doit créer un signal qui va envoyer la valeur de ta combox. Et tu fait connect avec ce signal.
    Mais je te conseil la solution 1 ou 2

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par black is beautiful Voir le message
    Le problème est que ça marche si le widget parent est bien de type WidgetMap, si il ne l'est pas, que se passe t-il ? Plantage ?
    yep plantage ou pas mais ton programme se retrouve en éxécution indéfinie et s'il n'as pas planté il plantera un peu plus tard. C'est la magie des erreur mémoire

    Sinon pour faire un cast propre en Qt utilise qobject_cast (tes class doive avoir la macro Q_OBJECT)
    http://qt.developpez.com/doc/4.4/qobject/#qobject_cast

    Un dynamic_cast devrais aussi être possible

    Par contre je te déconseille la méthode que tu utilise.
    Par exemple, si tu modifie WidgetMap il faudra surement modifier ta dialog

    A toi de voir ce qui te conviens le plus

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Ok, premièrement je vais utiliser diag.exec() parce-que ce n'est pas ce que j'avais fait jusque là.

    Par contre j'aimerai que quand WidgetMap récupère la valeur de la comboBox, elle s'affiche dans un label de MainWidget qui est le widget parent de WidgetMap. Alors quelle est la méthode la plus simple pour accéder à des méthodes d'un widget parent dérivé?

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par black is beautiful Voir le message
    Par contre j'aimerai que quand WidgetMap récupère la valeur de la comboBox, elle s'affiche dans un label de MainWidget qui est le widget parent de WidgetMap. Alors quelle est la méthode la plus simple pour accéder à des méthodes d'un widget parent dérivé?
    Utilise plutôt les signals/slots

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Ok merci, j'étais déjà tombé sur ces tutos mais j'avais un peu de mal avec ce système de communication entre widget.

    Donc je pense que le plus simple est que je crée mes propres signaux. Par exemple si je veux passé un QString à MainWidget depuis WidgetMap, je crée un signal dans MainWidget avec en paramètre le QString, je fais le slot correspondant dans MainWidget et après dans WidgetMap j'appelle le signal quand je veux avec le QString en paramètre.

    Mais comment appeler le signal de MainWidget, emit string_signal(name) ?
    ou emit MainWidget::string_signal(name) ?

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    emit string_signal(name);
    Regarde aussi la FAQ y as des expliquations

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Ok donc c'est ce que fais le qmake en fait avant la compilation, il cherche tous les signaux, ainsi ils pourront être appeler n'importe où dans le code, le compilateur s'y retrouvera toujours. C'est bien ça ?

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par black is beautiful Voir le message
    Ok donc c'est ce que fais le qmake en fait avant la compilation, il cherche tous les signaux, ainsi ils pourront être appeler n'importe où dans le code, le compilateur s'y retrouvera toujours. C'est bien ça ?
    Plus précisément qmake va préparer la compilation.
    Pendant la compilation moc va générer du code pour les isgnal/slot et des code spécifique au Q_OBJECT

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    J'ai lu la FAQ et suivi la méthode pour créer un signal mais j'ai une erreur à la compilation. Voilà le code :

    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
    class MainWidget : public QWidget
    {
        Q_OBJECT
     
        private:
            WidgetMap *map;
            QLabel *label;
            QSlider *slider;
            QPushButton *start_button;
            QPushButton *quit_button;
            QHBoxLayout *hbox;
            QVBoxLayout *vbox;
           ...
     
        signals:
            void sign_score(int value);
        private slots:
            ...
            void add_score(int value);
        public:
            MainWidget(QWidget *parent = 0);
    };
     
    MainWidget::MainWidget(QWidget *parent)
    {
       ...
        // Signaux perso
        QObject::connect(this, SIGNAL(sign_score(int)), this, SLOT(add_score(int)));
        ...
    }
     
    void WidgetMap::check_station(QString name)
    {
        ...
            emit sign_score(20); // Appel dans une autre classe
        ...
    }
    C'est au moment de l'emit, le compilateur me dit "sign_score undeclared (first use in this function)".
    Ce que je comprends puisque ce n'est pas connu de WidgetMap, mais comment faire alors ? D'après la FAQ ça doit marcher

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    il faut déclarer le signal dans WidgetMap et non MainWidget

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Super ça marche très bien maintenant. Merci beaucoup pour l'aide, je crois que j'ai bien compris le signal des slots maintenant

    A bientôt

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

Discussions similaires

  1. [XL-2010] Erreur automation suite à la fermeture d'une boite de dialogue
    Par badege3378 dans le forum Excel
    Réponses: 0
    Dernier message: 10/02/2015, 14h26
  2. [PPT-2003] Interrompre une macro jusqu'à la fermeture d'une boite de dialogue
    Par thilamb dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 29/11/2011, 08h47
  3. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  4. Réponses: 5
    Dernier message: 04/04/2003, 15h02
  5. Comment cree une boite de dialogue parcourir
    Par kenshi dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2003, 10h30

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