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 :

DLL d'éléments QML [Débuter]


Sujet :

Qt Quick

  1. #1
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut DLL d'éléments QML
    Bonjour,

    J'étudie l'utilisation du QML dans un projet. Il faudrait que je fasse une DLL contenant des composants QML personnalisés, à réutiliser pour créer des IHM (utilisation "desktop").

    La plupart des tutoriels montrent comment faire QML => C++ ou C++ => QML. Or là, il s'agirait de QML => C++ => QML ou C++. Dans mon idée, il faudrait que je regroupe mes éléments QML grâce à qmlRegisterType() (qui normalement, sert à transformer une classe C++ en élément QML). Donc faudrait faire une classe par .qml ? J'ai rien trouvé pour faire ça.

    Est-ce que l'idée-même vous semble farfelue ? Est-ce que vous pouvez m'expliquer comment m'y prendre ? (Est-ce que ce serait pas un plug-in en fait que je chercherais à faire ? Pas compris à quoi ça sert).

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Est-ce que ce serait pas un plug-in en fait que je chercherais à faire ?
    C'est bien cela.

    J'en ai fait un dans QExtend http://projets.developpez.com/projec...anches/dev/qml

    Je m'étais basé sur les exemples fournie par Qt.

    Le plu important est que ta dll soit dans un répertoire avec un fichier qmldir qui spécifie que ta dll et un plugin.

    Dans mon cas ce fichier contiens

  3. #3
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Merci de ta réponse,

    Effectivement dans l'idée tu as fait un plugin "classique" avec une implémentation C++. Ce que je cherche à faire c'est un plugin QML.

    Par exemple, j'ai fait une liste déroulante, DropDownList.qml (qui utilise un autre composant créé, MenuButton.qml). Cette liste déroulante va me servir dans des IHM, à travers un plugin qui la mettra à disposition.

    Ca semble plus naturel de simplement copier les QML dont je veux me servir dans mon projet, mais ce n'est pas ce qu'on me demande. Un simple "#include "mesqml.h" pour utiliser dans le C++, ou un "import MesQML 1.0" pour utiliser dans un .qml...

    Ce que j'aimerais savoir, c'est comment faire un plugin donc, à partir de ma DropDownList.qml ?
    J'imagine que je dois faire un projet Application QtQuick, avec mes QML dans un fichier de ressources (normal), une classe héritant de QDeclarativeExtensionPlugin pour créer le plugin, et il me manque la partie entre cette classe et mes .qml . Je vois pas comment faire, et si c'est aberrant de le faire.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Dans le plugin, j'intègre QExtend.qml

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DeclarativeComponent comp(engine);	
     QFile f(":/QExtend.qml");
     f.open(QIODevice::ReadOnly);
     QByteArray r = f.readAll();
     comp.setData(r,QUrl());
    engine->rootContext()->setContextProperty("QExtend",  comp.create());

    Pour mon cas c'est un object globale. Mais tu peux normalement le référencer pour être instanciable dans QML.

    Si c'est juste des .qml, il me semble que tu peux les mettre dans le répertoire du plugin et les référencer dans qmldir. Et donc pas besoin de faire de dll.
    Mais je n'en suis plus sure.

    http://qt.developpez.com/doc/latest/...-a-qmldir-file

  5. #5
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu m'as passé justement le lien sur lequel je suis tombé après mon précédent post

    Je me demande encore si en faisant comme ça, les .qml sont compilés dans l'application qui les utilise (pas question de les fournir à côté). Je vais voir si j'arrive à tester ça rapidement.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    pas question de les fournir à côté.
    Dans ce cas je pense (à vérifier) qu'il te faut faire une dll en les ajoutant sous forme de ressource et en les référançant dans le context qml. En gros ce que j'ai fait avec QExtend mais sans l'instanciation de l'objet.
    Mais il te faudra un répertoire avec la dll et le fichier qmldir.

    Tu peux normalement aussi mettre les fichier qml en ressource de ton appli et les utilisé directement.

  7. #7
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    J'y arrive pas Disons que je comprends pas pourquoi il faut un qmldir (et quel qmldir) ni l'enregistrement dans le contexte. Voici les sources :

    == DLL ==
    Code C++ : 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
    // .h
    #ifndef DROPDOWNLIST_H
    #define DROPDOWNLIST_H
     
    #include "Gui_global.h"
    #include <QWidget>
     
    class QGraphicsObject;
     
    class GUISHARED_EXPORT DropDownList : public QWidget
    {
        Q_OBJECT
     
    public:
        explicit DropDownList(QWidget *parent = 0);
        ~DropDownList();
     
        void build(QList<QObject*> list);
     
    private:
        QGraphicsObject* style();
    };
     
    #endif // DROPDOWNLIST_H

    Code C++ : 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
    33
    34
    35
    36
    37
    38
    39
    40
    // .cpp
    #include "DropDownList.h"
    #include <QGraphicsObject>
    #include <QDeclarativeView>
    #include <QDeclarativeContext>
     
    DropDownList::DropDownList(QWidget *parent) :
        QWidget(parent)
    {
    }
     
    DropDownList::~DropDownList()
    {
    }
     
    void DropDownList::build(QList<QObject*> list)
    {
        QDeclarativeView view(parentWidget());
     
        QDeclarativeContext *ctxt = view.rootContext();
        ctxt->setContextProperty("listItem", QVariant::fromValue(list));
        ctxt->setContextProperty("style", style());
     
        view.setSource(QUrl("qrc:/qml/DropDownList.qml"));
     
        QGraphicsObject *dropDownList = view.rootObject();
        dropDownList->setProperty("untitled", true);
        dropDownList->setProperty("iconed", true);
    }
     
    QGraphicsObject* DropDownList::style()
    {
        QDeclarativeView styleview;
     
        styleview.setSource(QUrl("qrc:/qml/style/Style.qml"));
     
        QGraphicsObject *style = styleview.rootObject();
     
        return style;
    }

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- .qrc -->
    <RCC>
        <qresource prefix="/qml">
            <file>qml/MenuButton.qml</file>
            <file>qml/DropDownList.qml</file>
            <file>qml/style/Style.qml</file>
        </qresource>
    </RCC>

    == PROJET UTILISANT LA DLL ==
    Un projet Qt normal, avec un QWidget et un .ui .
    Code C++ : 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
    // Widget.cpp
    #include "Widget.h"
    #include "ui_Widget.h"
    #include "objetavecnameeticon.h"
    #include "DropDownList.h"
    #include <QGraphicsObject>
     
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
     
        QList<QObject*> languageList;
        languageList.append(new ObjetAvecNameEtIcon("Français", "../images/fr.png"));
        languageList.append(new ObjetAvecNameEtIcon("Español", "../images/es.png"));
     
        QWidget conteneur(this);
        DropDownList list(&conteneur);
        ui->verticalLayout->addWidget(&conteneur);
     
        list.build(languageList);
    }
     
    Widget::~Widget()
    {
        delete ui;
    }

    Exécution (avec la dll dans le dossier d'exécution bien sûr) :

    qrc:/qml/style/Style.qml: File not found
    qrc:/qml/DropDownList.qml: File not found
    Je précise que c'est un prototype mais j'ai besoin de ce type de structure (une méthode build pour construire l'élément en passant la liste).

    Mes fichiers QML n'ont pas d'"import", ils sont dans le même dossier et il n'y a pas de qmldir.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    qmldir c'est pour spécifier un plugin à qml. C'est mis à côté de la dll du plugin.

    Essaie de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qrc:/qml/style/Style.qml
    par
    et d'enlèver le préfix dans ton fichier qrc

  9. #9
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Du coup ce n'est plus vraiment un plugin a priori.

    Bon, le coup d'enlever le préfixe est miraculeux (ou en fait l'url était qrc:/qml/qml/...), mais faut laisser "qrc" devant car c'est une QUrl (sinon il cherche un file:/).

    Bon ben, je vais voir si j'arrive à poursuivre seul, merci beaucoup pour l'aide, j'avoue que je sature complètement après quelques jours de doc QML intensive donc voilà l'erreur bête x)

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Non, ce n'est plus un plugin.
    Comme QML est jeune, il manqu epas mal d'info et justement sur la création de plugin

  11. #11
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Bon, y'a plus d'erreur, tout a l'air de marcher... Dommage que mon composant ne s'affiche pas ^^
    Peut-être que je m'y suis mal pris pour sa création ?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QWidget conteneur(this);
    DropDownList list(&conteneur);
    ui->verticalLayout->addWidget(&conteneur);

    Enfin bon il me reste à étudier le fonctionnement d'un verticalLayout je pense. Je verrai demain.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    Peut-être que je m'y suis mal pris pour sa création ?
    Indice : durée de vie de ta widget :p

  13. #13
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Voilà j'espère que c'est ça

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

Discussions similaires

  1. où trouver ces éléments : libglade-2.0.0.dll et libxml2.dll ?
    Par clavier12AZQSWX dans le forum Py2exe
    Réponses: 2
    Dernier message: 24/03/2011, 17h21
  2. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  3. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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