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 :

Accéder à une variable entre deux fenêtres

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut Accéder à une variable entre deux fenêtres
    Salut à tous,

    Dans ma 2eme fenêtre j'aimerai lire le contenu d'une variable qui a été calculé dans ma 1ere fenêtre. Voilà comment je m'y suis pris :

    dans le .h de ma 1ere fenêtre qui est un QWidget :

    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
    #ifndef Fenetre1_H
    #define Fenetre1_H
     
    #include <QWidget>
     
    namespace Ui {
        class Fenetre1;
    }
     
    class Fenetre1 : public QWidget
    {
        Q_OBJECT
     
    public:
        std::string sDate [100];
        ~Fenetre1();
    ...
    };
    Dans le .cpp de ma 2eme fenêtre qui est un QDialog:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "Fenetre1.h"
    ...
    Fenetre2::Fenetre2(QWidget *parent) :
        QDialog (parent),
    ...
    setText (Fenetre1::sDate [i]);
    ...
    Quand je compile il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur : object missing in reference to 'Fenetre1::sDate'
    Il y a une notion qui doit m'échapper....

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Tu déclares une sx_Date et tu utilises une sDate ? C'est une belle notion qui t'échappe en effet, l'importance du nom

    Ensuite il faut pas mettre "Fenetre1::", tu dois déjà être dans cet espace de nom si c'est une fonction Fenetre1::fonction(). Sinon tu voulais peut-être faire une variable statique.

    Pour terminer, en Qt on ne fait plus ces choses de barbares comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string sx_Date [100];
    On utilise les QString. Enfin c'est mon avis

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Non c'est une faute de copier collé

    Ok ça améliore quoi d'utiliser les QString ?

    J'aimerais la passer e static si ça résoud mon problème je vais essayer

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Hmm.. c'est plus un souci C++ de base que de Qt ; il vaudrait mieux refaire un petit tour vers les tutos C++, une réponse détaillée tiendra plus du cours C++ que d'une simple réponse.

    Rapidement, quelques conseils / remarques:

    1. pourquoi utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string sx_Date [100];
    Qt propose tout ce qu'il faut pour gérer les String avec QString... Utiliser des std pour ça, ça n'est pas forcément judicieux. Il y a des cas où ça l'est, si tu utilises une autre librairie que Qt et que pour des raisons de performances il est couteux de passer des stds aux QString, mais ça reste bien précis.

    2. setText (Fenetre1::sDate [i]);

    En C++, la notation ClassName:: a 3 principales fonctions.
    a. notation type "namespace", pour dire par exemple dans un fichier .cpp que la fonction void B::mafonction() { } est l’implémentation de la fonction mafonction de la classe B et non pas de la classe C.

    b. appeler la super classe:
    Ex: B hérite de A ; A a une fonction virtuelle mafonction() qui est redéfinie dans B. On peut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void B::mafonction()
    {
      faireqqchspecificaB();
      A::mafonction(); // ça appelle le code de A
    }
    c. appeler des membres (fonctions ou variables) statics:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
      public:
      static int mavariable;
    }
     
    A::mavariable = 3;
    Dans ton cas, rien de cela. Je te conseille donc de mettre ta variable en privée, de faire un accesseur (getXXX) public. Ensuite, dans ta 2e fenêtre, si tu as un accès à une instance de la première (pointeur, référence), tu pourras récupérer la valeur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Ok merci pour cette réponse complète. Je vais regarder tout ça et je vous tiens au courant.

    Et je passerai tous les strings en QString

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 133
    Par défaut
    Voilà j'ai passé tout mon projet en QString. J'ai remplacé les :

    par des et j'ai utilisé les fonctions des QString.

    Pour ce qui est de la récupération d'une variable dans la 2eme fenêtre je pense avoir la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Fenetre1* poMain;
        poMain = (Fenetre1*)parent;
    ...
    poMain -> VarFenetre1 [i])

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    En passant: pourquoi un tableau de 100 QString ?

    Ce que tu peux également faire, qui sera un peu plus propre à mon goût

    dans Fenetre1.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Fenetre1 ...
    ..
     
    public:
      QString getVar( int pos ) const;
     
    protected:
      QString m_Var[100]; // voire QVector<QString> ???
     
    ...
    dans Fenetre1.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    QString Fenetre1::getVar(int pos) const
    {
     if (pos >= 0 && pos < 100)
    {
    return m_Var[pos];
    }
    else
    {
     return QString::null;
    }
    }
    Dans Fenetre2.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fenetre2 : ...
    ...
    Fenetre2( Fenetre1 * parent );

    Dans Fenetre2.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Fenetre2::Fenetre2( Fenetre1 * parent ): QMainWindow(parent)
    ...
    {
    ...
    QString xxx = parent->getVar( 1 );
    ...
    }
    Comme ça, tu encapsules le stockage de tes données, si demain tu as une contrainte qui fait que tu dois passer d'un QString[100] à un QStringList ou autre, tu ne changes que Fenetre1 et pas le reste.
    Ensuite, typer le parent de Fenetre2 comme étant Fenêtre1, ça t'évitera de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QMainWindow w;
    Fenetre2 f (&w);
    Et boum, crash, vu que tu fais un cast C du parent en Fenetre1.

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

Discussions similaires

  1. Variables entre deux fenêtres windows form
    Par miklmikl dans le forum C++
    Réponses: 8
    Dernier message: 27/05/2010, 12h09
  2. passer une variable entre deux classes as3
    Par sanatou dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 27/06/2008, 21h52
  3. Partager une variable entre deux sites web
    Par debutantasp dans le forum ASP
    Réponses: 3
    Dernier message: 12/05/2008, 20h03
  4. sauver une variable entre deux fonctions ?
    Par shloka dans le forum Langage
    Réponses: 10
    Dernier message: 03/04/2007, 14h38
  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, 09h52

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