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 Quick Discussion :

Charger une interface Qt Quick depuis une application Windows non Qt


Sujet :

Qt Quick

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 11
    Par défaut Charger une interface Qt Quick depuis une application Windows non Qt
    Bonjour,

    Je suis complètement débutant sur QT, aussi je requiers vos avis concernant mon soucis et les interrogations qui en découlent.

    Je suis chargé de trouver de solutions pour mettre au goût du jour les éléments graphiques d'un environnement logiciel Windows de la boîte dans laquelle je bosse qui utilise toujours des éléments graphiques génériques WIN32 ou MFC. Ces éléments graphiques sont contenus dans des dll C WIN32 ou C++ MFC chargées dynamiquement par l'environnement comme plugins.

    J'ai donc pensé à intégrer QT pour faire cette mise à jour et bénéficier ainsi d'éléments graphiques avec un look plus moderne. De plus, la séparation C++/QML va complètement dans le sens de ce que l'on aimerait mettre en place.

    La contrainte, je ne peux pas toucher à l'application mère qui charge les plugins avec des LoadLibrary et appellent des point d'entrées définis (DllEntryStart, DllEntryEnd, DllFunc, etc ...).

    Peut on encapsuler complètement un environnement QT Quick dans une dll qui serait chargée dynamiquement de cette manière par un environnement C ou C++ non QT ?

    Je n'ai pas trouvé grand chose sur le sujet et ça ne m'a pas l'air si simple que ça. Vous avez des exemples, des pistes qui pourraient m'aider ?

    Merci d'avance pour vos réponses, je suis un peu bloqué pour le moment.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Si votre application mère ne fait que charger un point d'entrée, alors si vous développez directement votre application en considérant le main() comme étant votre point d'entrée de la dll, alors vous pouvez parfaitement intégrer votre environnement Qt et QtQuick dedans. Par exemple, le contenu de la dll pourrait être celui-ci (avec l'interface graphique instanciée dans main.qml et ses dépendances) :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    extern "C"
    {
        void myEntryPoint(int argc, char **argv)
        {
            QGuiApplication app(argc, argv); // Nécessaire à toute application Qt
     
            QQmlApplicationEngine engine;
            engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); // Chargement de l'interface graphique Qt Quick
     
            app.exec(); // Boucle d'événements de Qt ; vous en sortirez uniquement quand la fenêtre sera fermée
        }
    }

    Est-ce que ceci vous convient ou bien souhaitez-vous plus de précisions ?

    Bonne soirée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 11
    Par défaut
    Merci beaucoup pour votre réponse .

    Le problème, c'est que les arguments argc et argv correspondant à ceux du main ne sont pas passés aux points d'entrées des dlls "plugins". Il y a moyen de s'en passer ou des les récupérer autrement ?

    Je pourrais peut être les créer moi même en initialisant le premier argument avec le chemin de l'éxecutable. Pourquoi QT a t-il besoin des arguments de la ligne de commande ?

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Oui, vous pouvez vous en passer :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int unused = 0;
    QGuiApplication app(unused, NULL);

    De ce que j'en sais, Qt (sans majuscule sur le t, par contre) s'en sert exclusivement pour pouvoir faire qApp->arguments() et récupérer une QStringList contenant les arguments sans avoir à passer argc et argv à droite à gauche. Par conséquent, si vous faites qApp->arguments(), vous obtiendrez avec le code ci-dessus une liste vide.

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    Par défaut
    Cf la doc :
    Warning: The data referred to by argc and argv must stay valid for the entire lifetime of the QCoreApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string.
    Donc :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int argc = 1;
    char* argv[] = { "nom of application" };
    QGuiApplication app(argc, argv);

  6. #6
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    J'avais fait un test préalable qui fonctionnait, mais vu que la documentation précise cela, votre solution est plus appropriée.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

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

Discussions similaires

  1. [XL-2010] sélection des données depuis une base de données depuis une autre feuille
    Par Learning everyday dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/11/2014, 10h14
  2. Appeler une interface 2 à partir d'une interface 1
    Par cedric_kayo dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 13/10/2014, 09h35
  3. Réponses: 6
    Dernier message: 31/10/2012, 16h01
  4. Réponses: 14
    Dernier message: 23/04/2012, 22h32
  5. Réponses: 36
    Dernier message: 28/09/2005, 12h30

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