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 :

Échange de variables entre deux fenêtres

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut Échange de variables entre deux fenêtres
    Bonjour,

    A partir d'une QMainWindow, je construis un QDialog qui prendra en paramètre un pointeur sur une classe lambda construite également dans la fenêtre principale :

    maboitedialogue.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaBoiteDialogue::MaBoiteDialogue(Lambda* pLambda, QWidget *parent) :  QDialog(parent){...}
    Cela me permet de transférer simplement des variables de la fenêtre principale vers ma boîte de dialogue.

    En paramétrant les SIGNAL/SLOT des uns et des autres, je récupère les variables de ma boîte de dialogue pour les transférer cette fois-ci dans l'autre sens, à ma fenêtre principale.

    mainwindow.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maBoiteDialogue = new MaBoiteDialogue(pLambda, this);
    connect(ui->caseBoiteDialogue, SIGNAL(toggled(bool)), this, SLOT(AfficherBoiteDialogue(bool)));
    connect(maBoiteDialogue, SIGNAL(TransmettreInfo(int, QString, QString)),this, SLOT(RecevoirInfo(int, QString, QString)));
    Mon souci est que le transfert marche bien dans un sens (fenêtre principale vers boîte de dialogue), bien dans l'autre (boîte de dialogue vers fenêtre principale), mais pas dans les 2 sens en même temps !

    La faute à la fonction appelée ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MainWindow::AfficherBoiteDialogue(bool ok){
        if (ok)        
            maBoiteDialogue->exec();
    }
    Car elle n'arrive pas à construire la boîte de dialogue avec un pLambda actualisé par les actions de la fenêtre principale... D'où ma question : comment exécuter l'ouverture de la boîte de dialogue en récupérant le pointeur sur la classe lambda (pLambda) à cet instant là ?

    Merci pour vos lumières éclairantes, parce que je suis dans l'obscurité la plus totale

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 166
    Billets dans le blog
    154
    Par défaut
    Bonjour,

    Si la boite de dialogue est crée par la fenêtre principale, pourquoi ne pas utiliser un simple getter ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Si la boite de dialogue est crée par la fenêtre principale, pourquoi ne pas utiliser un simple getter ?
    Bonjour,

    Merci pour cette piste; néanmoins ma classe MainWindow n'hérite pas de ma classe Lambda (voir diagramme joint), celle-ci y est simplement instanciée; je ne peux donc pas y faire appel au getter
    Images attachées Images attachées

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Le diagramme ne correspond pas à ce que je comprends du premier message. La classe Lambda est créée/gérée par qui ? La boite de dialogue hérite réellement de cette classe Lambda ? (il serait absurde de lui passer un pointeur en paramètre du coup)

    De ce que je comprends du premier message. MainWindow gère (comprendre, crée, détruit, et affiche au besoin) la boite de dialogue. Je suppose que MainWindow crée/détruit également l'instance de Lambda, et agit sur les données de Lambda.

    Si les durées de vie de l'instance de Lambda et de l'instance de MaBoiteDeDialogue sont identiques, alors la boite de dialogue doit simplement conserver un pointeur (ou mieux une référence) vers l'objet lambda et transmettre les données directement par des fonctions de cet objet. Dans ce cas là inutile d'utiliser les signaux/slots pour transmettre les données. Et la boite de dialogue a en permanence accès à lambda pour lui faire faire des traitements.

  5. #5
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    La classe Lambda est créée/gérée par qui ? La boite de dialogue hérite réellement de cette classe Lambda ? (il serait absurde de lui passer un pointeur en paramètre du coup)
    Une variable de type Lambda est créée dans MainWindow (par l'intermédiaire d'un pointeur) et y est modifiée. C'est de ces modifications dont j'ai besoin lorsque je crée MaBoiteDialogue; et cette dernière doit à son tour modifier la même variable de type Lambda (pLambda).

    Citation Envoyé par ymoreau Voir le message
    De ce que je comprends du premier message. MainWindow gère (comprendre, crée, détruit, et affiche au besoin) la boite de dialogue. Je suppose que MainWindow crée/détruit également l'instance de Lambda, et agit sur les données de Lambda.
    oui, c'est par une case à cocher de la MainWindow qu'on crée MaBoiteDialogue, en lui transmettant pLambda par son constructeur.

    Citation Envoyé par ymoreau Voir le message
    Si les durées de vie de l'instance de Lambda et de l'instance de MaBoiteDeDialogue sont identiques, alors la boite de dialogue doit simplement conserver un pointeur (ou mieux une référence) vers l'objet lambda et transmettre les données directement par des fonctions de cet objet.
    Les durées de vie sont différente : l'instance de Lambda apparaît à la construction de la MainWindow, est modifiée successivement par cette dernière et par MaBoiteDialogue et n'est détruite qu'avec la MainWindow.

    Et c'est bien tout ma difficulté : construire MaBoiteDialogue avec l'instance modifiée de Lambda tout en ayant des 'connect' permanent entre MainWindoW et MaBoiteDialogue : dans le premier cas je construis ma fenêtre dans la fonction AfficherBoiteDialogue(), dans le second je dois la construire dans le constructeur de MainWindow. Mais l'un est exclusif de l'autre... sauf à transmettre pLambda modifié à MaBoiteDialogue, ce que je n'arrive pas à faire autrement que par son constructeur.

  6. #6
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Je comprends peut être de travers, mais les durées de vie semblent justement être exactement les mêmes entre l'objet lambda et la boite de dialogue (puisqu'elle est connectée dés le constructeur de mainwindow). D'après le code fourni, la boite de dialogue n'est pas construite au moment de l'affichage mais appartient à la MainWindow au même titre que lambda.

    Donc, il n'est pas nécessaire de passer pLambda à chaque affichage de la boite de dialogue, car l'objet lambda ne change pas, son adresse non plus, son pointeur passé en paramètre à la boite de dialogue reste valide tout le long de l'exécution de MainWindow.

    Cela dit, il est assez fréquent de ne créer une boite de dialogue qu'au moment où on veut l'afficher, surtout si elle est modale (comme ici).
    Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::AfficherBoiteDialogue(bool ok) {
        if (ok) {
            MaBoiteDialogue maBoiteDialogue(pLambda, this);
            maBoiteDialogue.exec();
        }
    }
    L'objet boite de dialogue est local à cette fonction, il n'est créé en mémoire que si l'on a effectivement besoin de l'afficher (mais sera créé à chaque appel, c'est un choix à réfléchir).

    Pour continuer avec ta solution de signal/slot tu pourrais faire le connect au même endroit, juste après avoir créé l'objet maBoiteDialogue. Cependant comme je l'ai dit plus haut, ça ne me semble pas une bonne idée :
    Je suppose que la MainWindow va appeler des setters/getters de lambda, et que la boite de dialogue fera la même chose. Autant appeler directement les fonctions sur pLambda plutôt que de passer par un signal/slot entre MainWindow et MaBoiteDialogue, puisque chaque objet a directement accès à lambda.

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

Discussions similaires

  1. Échange de données entre deux fenêtres
    Par hbenji dans le forum Débuter
    Réponses: 3
    Dernier message: 08/04/2013, 12h02
  2. Accéder à une variable entre deux fenêtres
    Par Kermichou dans le forum Débuter
    Réponses: 6
    Dernier message: 13/09/2011, 15h36
  3. Variables entre deux fenêtres windows form
    Par miklmikl dans le forum C++
    Réponses: 8
    Dernier message: 27/05/2010, 13h09
  4. échange de données entre deux fenêtre
    Par hodhodeni dans le forum Débuter
    Réponses: 1
    Dernier message: 11/06/2009, 15h32
  5. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 10h52

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