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 :

Récupération de QApplication après le exec()


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Récupération de QApplication après le exec()
    Bonjour,

    Je souhaiterais faire la chose suivante :
    - lancer une Qapplcication via une classe.
    - y ajouter des widgets sachant que chaque widget est une classe à part et doit recuperer la QApplciation

    J'ai essayé avec QApplication::instance() dans chaque widget, mais le problème est que lorsqu'on lance la QApplication dans la classe "prinipale" on ne revient plus du exec().

    J'aimerais éviter les threads, est-ce possible ?

  2. #2
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Je comprends pas vraiment ton problème.

    Pour "démarrer" ton application, tu fais un QApplication::exec();.

    Ensuite, si tu as besoin de manipuler ton instance de QApplication, tu peux, partout dans ton code (à condition que tu aies un #include <QApplication>), utiliser la macro qApp qui retourne un pointeur vers cette instance.

    En terme de conception, il est plus propre d'écrire l'exec dans le main, et non dans une classe précise, de manière à bien segmenter ton code et rendre à chacun ses responsabilités (ce n'est pas à une classe de décider de l'exécution de ton application).

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Pourrais-tu être plus précis s'il te plait, sur le passage avec la macro qApp.
    Commnet cela s'utilise ?

    Donc dans le main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // class contenant le main()
    QApplication::Qapplication app = new ....;
    ....
     
    QApplication::exec(); // si j'ai bien compris
    Puis dans les autres classe, comment j'utilise qApp ?

  4. #4
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Exemple de main qui affiche le widget MonWidget :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <QApplication>
    #include "MonWidget.h"
     
    void main(int argc, char * argv[])
    {
    QApplication app(argc,argv);
     
    MonWidget w;
    w.show();
     
    return app.exec();
    }
    MonWidget.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
     
    #include <QApplication>
    #include <QWidget>
     
    class MonWidget : public QWidget
    {
        Q_OBJECT
     
        public :
     
        MonWidget (QWidget * parent = 0);
     
        //Stuff
    };
    MonWidget.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "MonWidget.h"
     
    MonWidget::MonWidget (QWidget * parent) : QWidget(parent)
    {
        //Ton constructeur
     
        //Exemple d'appel à l'instance courante de QApplication :
        qApp->setStyleSheet("/chemin");
    }

    NB : le main est dans un fichier main.cpp, surtout pas dans un fichier relatif à une classe particulière !

  5. #5
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    OK donc qApp c'est à la place QApplication::instance(), mais dans ton exemple, comment faire pour que le widget s'ajoute à l'application à la manière d'un plugin.

    Moi je voudrais plutôt quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
     QApplication app( argc,  argv);
     ...
    // ici l'application n'est pas encore lancer, donc rien à recuperer pour myWidget
     IHM.addWidget();
     
    app.exec(); // si je le mets avant mywidget ..., on n'en reviendra jamais
    }
    Dans IHM.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void addWidget()
    {
     // Recuperer l'application courante alors que pas d'exec() dans le main()
      QApplication app = qApp-> ???.
      MyWidget *w = new MyWidget();
      w->resize();//par exemple
     w->show();
     
    }
    Ca ne marche pas.

  6. #6
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    A la manière d'un plugin?

    J'ai très beaucoup de mal à comprendre ton problème.

    IHM.addWidget();
    Qu'est ce que IHM ???

    // Recuperer l'application courante alors que pas d'exec() dans le main()
    QApplication app = qApp-> ???.
    A quoi ça sert ça ?

    app.exec sert à lancer la machine dans un état initial défini par tout ce qui précède cette ligne (ici, la création de MonWidget). Plus en détail, il s'agit de la création de l'eventLoop de Qt qui permet le bon fonctionnement des objets de Qt (comprenant l'affichage de fenêtres).

    Une fois lancé, tu n'as pas besoin de "suite". Ce sont tes objets qui se chargeront de répondre aux actions de l'utilisateur sur ton application (avec le système de signaux et slots, par exemple, tu indiquera que faire après l'appui sur un bouton, ect...).


    Bref, tu devrai commencer par lire des cours et tutos sur Qt afin d'y aller étape par étape.

  7. #7
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Je me suis peut etre mal exprimé.
    Je souhaite en fait lancer le main() en affichant une fentre simple par exemple, puis ensuite faire un truc du genre (toujours dans le main) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QApplication app = new ... ;
    ...
    Mywidget *w = new .... ;
    w->addWidget("menu"); // menu par exemple
    ...
    app.exec();
    Dans Widget.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    void addWidget(Widget w)
    {
     ...
     // Recuperer la QApplication issue du main()
       qApp->methode(w);
    // où methode sert à ajouter w à l'application
    }
    Comment faire celà (de cette manière ou d'une autre ?
    Merci.

  8. #8
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Explique moi ce que signifie pour toi "//où methode sert à ajouter w à l'application" (En français, pas en code. Je veux comprendre l'idée que tu souhaites mettre en place).

    Dans ton usage précis, quelle est la méthode de QApplication que tu souhaites manipuler?

  9. #9
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Dans le main(), je lance une Qapplication.
    Puis j'affiche une simple fenetre.
    Donc, j'obtiens une application deans laquelle j'affiche une fenetre, autrement dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            QApplication app( argc,  argv);
    	QWidget widget;
    	widget.resize(750, 550);
            widget.show();
            app.exec();
    Puis je souaiterais y ajouter un menu par exemple, mais sans le faire directement dans le 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
     
            QApplication app( argc,  argv);
    	QWidget widget;
    	widget.resize(750, 550);
            widget.show();
     
            // ce que je ne veux pas faire
            QMenuBar * menu = new QMenuBar();
    	QMenu * file = new QMenu("Fichier", &widget);
    	menu->addMenu(file);
    	menu->show();
            // fin ajout menu
     
            app.exec();
    Mais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       QApplication app( argc,  argv);
    	QWidget widget;
    	widget.resize(750, 550);
            widget.show();
     
            Menu m = Menu();
            m.addMenuBar();
    Ce que j'appelle "ajouter le menu à l'application" c'est faire en sorte que le menu s'ajoute à la fenetre lancée dans le main().

    Dans Menu.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void addMenuBar()
    {
      //Je veux ajout un menu au widget "widget" du main().
      // Mais je ne sais pas comment manipuler qApp pour le faire
    }
    Dans ton usage précis, quelle est la méthode de QApplication que tu souhaites manipuler?
    Justement, je n'ai pas trouvé cette méthode.

  10. #10
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Ce que j'appelle "ajouter le menu à l'application" c'est faire en sorte que le menu s'ajoute à la fenetre lancée dans le main().
    Ah, donc c'est bien à ta fenêtre et non à l'application qu'il faut l'ajouter !

    // ce que je ne veux pas faire
    QMenuBar * menu = new QMenuBar();
    QMenu * file = new QMenu("Fichier", &widget);
    menu->addMenu(file);
    Pourquoi ne veux tu pas faire ça ?

    Au passage, si tu souhaites faire une fenêtre d'application classique (avec toolbars ect, c'est QMainWindow (http://qt.developpez.com/doc/latest/qmainwindow.html) et sa méthode setMenuBar() qu'il faut utiliser.

    Justement, je n'ai pas trouvé cette méthode.
    C'est normal, ceci ne fait pas partie des responsabilités de QApplication. Ce n'est pas à l'application qu'il faut ajouter ton item, mais à la fenêtre.
    On parle du menu de la fenêtre, c'est donc dans la fenêtre qu'il faut que tu places ce code. Je te suggère d'ailleurs de l'écrire dans le constructeur de cette fenêtre.


    Je te conseille de prendre le temps de bien lire la documentation officielle de QMainWindow qui contient tout ce qu'il faut pour résoudre ton problème.

  11. #11
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    OK, je comprends ce qu'il faut faire à présent.
    Mais concernant la QMainWindow, comment la "recuperer" une fois qu'elle sera lancer depuis le main()?

    J'ai essayé les allWidgets() ou encore topLevelWidgets(), mais je n'arrive pas à recuperer la fenetre courante à la maniere d'un getParent() de wxWidget.

  12. #12
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par juve1897 Voir le message
    OK, je comprends ce qu'il faut faire à présent.
    Mais concernant la QMainWindow, comment la "recuperer" une fois qu'elle sera lancer depuis le main()?

    J'ai essayé les allWidgets() ou encore topLevelWidgets(), mais je n'arrive pas à recuperer la fenetre courante à la maniere d'un getParent() de wxWidget.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w; // La classe héritant de QMainWindow
        w.show();
        return a.exec();
    }
    Dans le main :

    Dans ta classe héritant de QMainWindow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->taFonction();

Discussions similaires

  1. Récupération de contacts après migration
    Par dj_benz dans le forum Outlook
    Réponses: 3
    Dernier message: 27/06/2007, 16h57
  2. Récupération des données après restauration du système avec Ghost
    Par digital prophecy dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 12/06/2007, 14h05
  3. Réponses: 1
    Dernier message: 04/06/2007, 11h34
  4. Réponses: 3
    Dernier message: 19/04/2007, 21h55
  5. [MySQL] syntaxe variable lors d'une récupération de valeurs après mysql
    Par mussara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/11/2006, 13h30

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