Echanges de données entre fenêtres

Il est fréquent qu'un fenêtre, MainWindow par exemple, provoque l'ouverture d'une fenêtre (Dialog par exemple) en lui passant des paramètres.

De la même manière cette fenêtre se ferme en passant des valeurs à la fenêtre mère.


La création de la fenêtre principale est classique (voir les différents exemples de ce cours)

Prenons comme exemple un tapis de roulette.

En cliquant sur un des boutons, on provoque l'ouverture d'une fenêtre de dialogue grâce à laquelle il est possible de miser une valeur sur la case.


Le code lié à l'appel de cette fenêtre est classique :

Dans mainWindow.h :

  • Déclaration de Fenetre qui est une instance de Dialog
  • Création du void permettant de récupérer la valeur générée par la fenêtre de dialogue
  • création du slot qui gère le bouton d'ouverture de la fenêtre

Dans mainwindow.cpp

Le code de la classe de la fenêtre de dialogue est le suivant :

#ifndef DIALOG_H

#define DIALOG_H


#include <QDialog>


namespace Ui {

class Dialog;

}


class Dialog : public QDialog

{

    Q_OBJECT


public:

    explicit Dialog(QWidget *parent = 0);

    ~Dialog();

    void setChoice(unsigned char num); //permet de recevoir les données de la fenêtre mère

    void getBid(int & mise); //permet de transmettre les données de la fenêtre mère

public slots:

    void on_buttonBox_accepted();

    void on_buttonBox_rejected();

    void on_mise5_clicked();

    void on_mise10_clicked();

    void on_mise25_clicked();

    void on_mise50_clicked();

    void on_mise100_clicked();

    void on_mise500_clicked();

private:

    Ui::Dialog *ui;

};


#endif // DIALOG_H

Les boutons de mise (5, 10, 25, 50, 100 et 500) permettent de fixer la valeur d'une variable (miseG) grâce à un slot :

void Dialog::on_mise100_clicked()

{

    miseG=100;

}

Transmettre une donnée de la fenêtre mère vers la fenêtre fille

La procedure setChoice permet à MainWindow de transmettre le numéro de la case du tapis sélectionnée.

Cette procédure est appelée après la création de la fenêtre avec comme paramètre le numéro de la case.

Elle est liée dans dialog.cpp à une procédure qui affecte la valeur de num à un label :

void Dialog::setChoice(unsigned char num)

{

    ui->choixLabel->setText(QString::number(num));

}


Et c'est tout..... SIMPLE


Transmettre une donnée de la fenêtre fille à la fenêtre mère

exec() exécute la fenêtre de dialogue et l'affiche.

Lorsque cette fenêtre est fermée (close) elle renvoie le code 0.

Lors de la fermeture, il suffit d'appeler une fonction liée à la fenêtre fille qui restitue une valeur de variable (ici la mise). Cette fonction (ou void) est getBid dans notre cas.

Le code de getBid est là encore très simple :

void Dialog::getBid(int &mise)

    {

       mise=miseG;

    }

la mise est transmise par la fonction dans une variable transmise par son adresse en mémoire (&mise).


Cette valeur peut ensuite être récupérée dans le code de la fenêtre principale.