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 :

Envoyer une QString d'un QWidget à un autre ?

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut Envoyer une QString d'un QWidget à un autre ?
    salut a tous,
    je débute avec QT et je voudrais envoyer une variable de type QString d'un Qwidget a un autre.

    voici 1ere fenetre .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
    29
    30
    31
    32
     
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <wii.h>
     
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    public slots:
        void click();
     
    signals:
        void envoyer(QString mot);
     
    public:
        Ui::MainWindow* ui;
        wii *l;
    };
     
    #endif // MAINWINDOW_H
    et 1ere fenetre .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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(ui->ok,SIGNAL(clicked()),this,SLOT(click()));
     
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow:: click()
    {
        QString mot = ui->lineEdit->text();
        emit envoyer(mot);
     
        l=new(wii);
        l->show();
        this->close();
    }
    2eme fenetre .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
     
    #ifndef WII_H
    #define WII_H
     
    #include <QWidget>
     
    namespace Ui {
    class wii;
    }
     
    class wii : public QWidget
    {
        Q_OBJECT
     
    public:
        explicit wii(QWidget *parent = 0);
        ~wii();
     
    public slots:
        void afficher(QString mot);
     
    private:
        Ui::wii *ui;
    };
     
    #endif // WII_H
    et 2eme fenetre.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
     
    #include "wii.h"
    #include "ui_wii.h"
    #include "mainwindow.h"
     
    wii::wii(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::wii)
    {
        ui->setupUi(this);
        connect(this,SIGNAL(envoyer(QString)),this,SLOT(afficher(QString)));
    }
     
    wii::~wii()
    {
        delete ui;
    }
     
    void wii::afficher(QString mot)
    {
        ui->lineEdit->setText(mot);
    }
    je crois que tout est dans l'ordre . la compilation s'effectue sans erreurs mais rien ne s'affiche dans la 2eme fenetre.
    merci d'avance pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 29
    Par défaut
    Tu as une erreur sur l'objet qui envois le signal sur ta deuxième fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ui->setupUi(this);
    connect(this,SIGNAL(envoyer(QString)),this,SLOT(afficher(QString)));
    Ici tu essaye de connecter le signal que CETTE (wii) fenêtre aurait envoyé. Or c'est pas celle-ci qui envois le signal mais c'est la première fenêtre (MainWindow) qui l'envois. Donc tu n'aura pas d'erreurs de compilation parce que syntaxiquement parlant tu n'en as pas faite. Mais rien ne se passera car la fenêtre numéro 2 (wii) attend un signal qui ne viendra jamais.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Avant de te répondre (car je pourrais le faire directement, mais bon, autant te laisser l'occasion de réfléchir un peu ), j'aimerais avoir ton avis sur le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MainWindow:: click()
    {
        QString mot = ui->lineEdit->text();
        emit envoyer(mot);
     
        l=new(wii);
        l->show();
        this->close();
    }
    As ton avis, qu'espères tu qu'il va se passer, et, surtou, qu'espères tu qu'il va se passer au niveau de emit envoyer(mot)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    Merci pour votre réponse Allchimiste:

    je sais bien que le signal envoyer(mot) est lié à la fenêtre "MainWindow" et lorsque je change:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      connect(MainWindow,SIGNAL(envoyer(QString)),this,SLOT(afficher(QString)));
    j'obtiens cette erreur:

    C:\Qt_Projects\test\wii.cpp:10: erreur : expected primary-expression before ',' token
    Je ne sais pas quoi mettre a la place de "MainWindow"

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    Comme je le dis Koala je débute avec Qt.
    emit envoyer(mot) va activer le signal qui sera capté lors de l’ouverture de la 2ème fenêtre.
    enfin c'est ce que j'ai comme idée
    merci d'avance

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mais, as tu conscience que:
    1- Le constructeur de MainWindow n'effectue aucune initialisation du pointeur l, ce qui fait que, quand MainWindow est créé, l peut valoir strictement... tout et n'importe quoi (sauf, à n'en pas douter, une adresse valide à laquelle on pourrait effectivement trouver une objet de type wii)

    2- de la logique mise en place dans le code que j'ai mis en évidence

    Parce que, débuter avec Qt est une chose, mais faire du grand n'importe quoi en terme de logique en est une autre

    En effet, une fois que tu as récupéré ta QString (bon, ca, ca semble en effet etre la première chose qu'il faut faire ), tu vas émettre un signal qui, même s'il était correctement connecté au niveau de ta classe wii, ne serait connecté strictement à rien lors de la première exécution (cf mon 1).

    Et que ce n'est qu'après avoir émis le signal (qui, en attendant, aura été "perdu") que tu vas créer un nouvel objet de type wii et dont tu donneras l'adresse à l avant de faire s'afficher la fenetre en question.

    Les exécutions poseront encore d'avantage de problèmes car, même en considérant que le signal est correctement connecté, tu vas récupérer la chaine de caractères qui t'intéresse, ce qui reste toujours une bonne idée.

    Puis tu vas émettre le signal envoyer(mot) qui sera récupéré par l, ca, c'est pas trop mal.

    Sauf que, juste après, tu vas créer une nouvelle fenêtre (qui elle, n'aura pas eu la chance de récupérer le signal) et que tu vas donner l'adresse de cette fenêtre à l, en... perdant l'adresse de la fenêtre que tu avais créé à l'exécution précédente ==> fuite mémoire.

    Et, enfin, c'est cette nouvelle fenêtre que (qui, rappelons le, n'a pas eu la chance de récupérer le signal émis) que tu vas essayer de faire afficher.

    A ton avis, quelle est l'erreur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    t'as raison en terme de logique j'ai fais n'importe quoi

    j'ai compris le fait que le signal est perdu avant que la 2emme fenetre sera instanciée mais je vois pas comment faire?

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    T'as raison Koala un peu de logique et tout ça sera bien

    j'ai fais l=new(wii) dans le constructeur de ma classe "MainWindow" puis je fais "connect" a la suite et non dans la 2ème fenêtre:

    MainWindow.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
     
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        l=new(wii);
        connect(this,SIGNAL(envoyer(QString)),l,SLOT(afficher(QString)));
        connect(ui->ok,SIGNAL(clicked()),this,SLOT(click()));
     
     
     
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow:: click()
    {
        QString mot = ui->lineEdit->text();
        emit envoyer(mot);
        l->show();
        this->close();
    }
    et tout se passe a la parfait

    c'est Ton idée Koala je pense?

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 29
    Par défaut
    Comme l'a si bien dit koala01 tu as un problème de logique, mais essayons de passer outre la logique vient parfois après avoir pratiquer chez certains.

    Deux trois remarques et indices :

    1 - Il faut faire en sorte que la fenêtre qui doit afficher le résultat connaisse la fenêtre qui envois le signal.
    La première fenêtre instanciée est MainWindow donc on peut dire que c'est ta classe principale, c'est elle qui doit "connaître" tout le monde (enfin de mon point de vue).
    2 - Tu fait en sorte que cette classe connaisse la définition de la seconde, ensuite tu crée un objet (new) de cette seconde classe dans le constructeur de ta MainWindow et tu cache la seconde fenêtre dans le constructeur également (Sinon logiquement la deuxième fenêtre s'affiche lors de la construction de son objet).
    3 - Tu fait ton traitement de texte, tu créer ton signal, et tu l’envoie. Et tu affiche la deuxième fenêtre.
    4 - Tu fait un slot public (Pas énormément de gens aiment ça mais c'est ce que je trouve de plus simple et efficace) dans la classe de ta deuxième fenêtre.
    5 - Tu connecte ton signal dans le constructeur de ta MainWindow (C'est le plus simple, car en réalité tu peut le mettre ou tu veut mais ça implique de faire des "connect()" et "disconnect()" ) ce connect tu lie l'origine avec ta MainWindow et la cible avec l'objet de ta seconde fenêtre sur le slot public
    6 - Tu gère ton traitement dans la fonction slot public que tu as créer avec le(s) bon argument(s) qui va(vont) bien.

    Essaye de réfléchir un peut a ça. Si tu y arrive pas je te donnerais des pistes un peut plus "code". Mais je te donne pas le code tout cuit sinon tu va rien apprendre et donc tu t’améliorera pas.

    EDIT : Ha bey j'ai mit trop de temps a écrire ma réponse en parallèle de mon boulot. Tu as fait exactement ce que j'avais décrit .

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    Merci Allchimiste pour votre explication

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/09/2008, 10h35
  2. Envoyer une variable d'un script PHP à un autre
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 27/06/2007, 09h41
  3. envoyer une valeur d'une page à une autre
    Par gloglo dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 10/01/2007, 13h37
  4. Réponses: 13
    Dernier message: 13/09/2006, 21h39
  5. Réponses: 2
    Dernier message: 21/08/2006, 09h37

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