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

Qt Discussion :

Déclarer une variable accessible partout


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut Déclarer une variable accessible partout
    Bonjour,

    J'ai un projet Qt dans lequel je voudrais qu'une variable déclarée dans le main soit accessible de partout dans mon projet, dans le main comme dans une autre classe. Je vous montre mon main:

    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
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        QCoreApplication::setOrganizationName("GADZ36");
        QCoreApplication::setApplicationName("MyMediaLibraries");
        QQmlApplicationEngine engine;
     
        bdd basededonnees;
     
        //Mise à disposition des jaquettes pour la partie QML
        JacketModel* modele = new JacketModel(basededonnees.listJackets());   
        engine.rootContext()->setContextProperty("jacketList", modele);
     
        //Mise à disposition des paramètres de l'application pour la partie QML
        Parametres* parametres=new Parametres;    
        engine.rootContext()->setContextProperty("parametres", parametres);
     
        //Mise à disposition du modèle contenant les dossiers des films pour la partie QML
        ListCheminModel* listeChemins=new ListCheminModel(parametres->listeDossiersFilms);    
        engine.rootContext()->setContextProperty("listeChemins", listeChemins);
     
     
        //Création d'un objet spécial pour afficher les données des films dans la partie QML
        movieForQml *movieDetails = new movieForQml;
        engine.rootContext()->setContextProperty("movieDetails",movieDetails);
     
        //##################################################################################################
     
        engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
     
        return app.exec();
    }
    Dans mon cas, je déclare une context property "modele" qui contient un model de données pour ma partie QML. C'est en fait un tableau contenant des objets que j'ai créé, des jackets. Ce "modele" contient une fonction qui s'appelle updateModel() que je souhaiterais appeler depuis l'une de mes classes. Le problème étant que je veux le déclarer dans le main car il faut que ça se charge au démarrage de l'application mais je n'arrive pas à trouver un moyen d'y accéder de partout. Est-ce que vous pouvez m'aider avec ça?

    Cordialement

  2. #2
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Une idéale juste comme ça.

    Vous pouvez créer une classe static, qui elle est déclaré dans un .h et cpp à part.

    Ensuite, vous faites un include dans votre main.cpp et vous instanciez cette class ainsi que vous la mettez dans votre context.

    Pour toutes autres classes nécéssitant les services de cette, vous faites un inlucde.

    Ex :

    MaClass.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MaClass : public QObject
    {
        Q_OBJECT
    public:
        Q_INVOKABLE void DireBonjour();
         ....
    }
    MaClass.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "MaClasse.h"
     
    MaClasse::DireBonjour()
    {
         qDebug() << "Bonjour ";
    }
     
    ...
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "MaClass.h"
     
    // Instance static
    MaClasse maClasse;
     
     
    int main(int argc, char *argv[]) {
     
        QGuiApplication app(argc, argv);
     
        QQmlApplicationEngine engine;
        engine.rootContext()->setContextProperty("maClasse", maClasse);

    xxx.qml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Component.onCompleted : {
            maClass.direBonjour();
       }
    Un autre c++ classe qui pourrait en avoir de besion :

    MonAutreClass.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "MaClasse.h"
    class MonAutreClass : public QObject
    {
        Q_OBJECT
    public:
        explicit MonAutreClass (QObject *parent = 0);
         ....
     
        Q_INVOKABLE void direBonjourDePuisMaClass();
    }
    MonAutreClass.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
     
    #include "MonAutreClass.h"
     
    MonAutreClass::MonAutreClass(QObject *parent)
        : QObject(parent)
    {
     
    }
     
    void MonAutreClass::direBonjourDePuisMaClass()
    {
       MaClass::direBonjour();
    }
    ...
    Je n'ai pas testé par contre, mais l'idée est là.
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Juste une petite question au passage... Les constructeurs, selon toi, ca sert à quoi C'est pour les chiens
    Ta fonction main ne devrait pas être plus compliquée que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int argc, char ** argv){
        MyApp app(argc, argv);
        return app.exec();}
    (avec MyApp étant une classe dérivée de QApplication). Tout ce qui se trouve en plus dans ta fonction main n'a absolument rien à foutre là.

    Ainsi, tu devrais avoir au minimum une classe (nommée ici MyApp) dérivée de QApplication et une classe (que j'appellerai MyQml) dérivée de QQmlApplicationEngine.

    Ta classe MyApp contiendrait une instance de MyQml qu'elle initialiserait correctement dans son constructeur et ta classe MyQml contiendrait tout ce qui a trait à la base de données et au modèle.

    Et, bien sur, MyQml s'occuperait d'initialiser tout ce qui a trait à la base de donnée et au modèle dans son propre constructeur.

    Si bien que la ligne MyApp app(argc, argv); aura pour résultat de faire toute l'initialisation pour toi, sans que tu n'aies à t'occuper de rien d'autre que de lancer l'exécution de l'application dans ta fonction main.

    Tout le reste se fera de toute manière au travers de ta classe MyQml qui se chargera de réagir aux différents événements et signaux qui seront envoyés / reçus et des actions clairement déterminées. Et comme MyQml disposera aussi bien de la connexion à ta base de données que du modèle, il lui sera on ne peut plus simple de fournir les informations nécessaires à chaque slot effectué en réponse à l'exécution des actions déterminées
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Allez, je vais même aller un peu plus loin :

    Voici à quoi devrait ressembler ta classe MyApp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MyQml;
    class MyApp : public QApplication{
        QOBJECT // pas sur qu'il doive apparaitre ici :P
    public:
        MyApp(int argc, char ** argv);
    private:
        MyQml * qm_;
    };
     
    MyApp::MyApp(int argc, char ** argv):QApplication(argc, argv), qml_(new MyQml(this){
    }
    et voici à quoi devrait ressembler ta classe MyQml :
    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
    class MyQml : public QQmlApplicationEngine{
    public:
        MyQml(QObject * parent = 0);
    /* il manque surement un tas de trucs ici, pour pouvoir répondre aux différents événement
     * susceptibles de provoquer une réaction de la part de la fenêtre Qml ;)
     */ 
    private:
        bdd * bdd_;
        JacketModel * model_;
        Parametres * parameters_;
        ListCheminModel* paths_;
       /* ... */
    };
     
    MyQml::MyQml(QObject * parent = 0): QQmlEngine(parent){
        /* on initialise la base de donnée, les modèles et tout ce qu'il 
         * faut ici
        */
    }
    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

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Merci je vais tester ça et je vous tiens au jus des avancées.

    Cordialement

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/04/2010, 22h10
  2. Comment déclarer une variable binaire?
    Par Pragmateek dans le forum C++
    Réponses: 12
    Dernier message: 22/03/2006, 17h35
  3. Déclarer une variable globale
    Par OverLorD34 dans le forum MFC
    Réponses: 8
    Dernier message: 18/03/2006, 10h46
  4. [Variable] Déclarer une variable avec un nom dynamique
    Par jacquesh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/02/2006, 14h11
  5. Réponses: 5
    Dernier message: 20/09/2005, 22h48

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