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 ?

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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?

+ 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