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 :

Ajout dynamique de composants


Sujet :

Qt Quick

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Par défaut Ajout dynamique de composants
    Bonjour,

    Je souhaite ajouter dynamiquement des composants QML dans une QGraphicsScene, c'est a dire afficher un nombre de composants défini par l'utilisateur. Ceci est un test et l'objectif final est de créer des QList<MonComposant>. Le probleme est que lorsque je crée une instance de ma classe je ne parviens pas a l'afficher.
    Avec le code suivant mon piechart est bien visible:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart");
     
        QDeclarativeView view;
        view.setSource(QUrl("qrc:/app.qml"));
        view.show();
        return app.exec();
    }

    Avec ce code ci qui crée un nouveau piechart, la vue est vide

    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
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart");
     
        QDeclarativeView view;
        PieChart *pie = new PieChart();
        QGraphicsScene *scene = new QGraphicsScene();
        scene->addItem(pie);
        view.setScene(scene);
        view.show();
        return app.exec();
    }

    J'ai crée ma classe Piechart qui hérite de QDeclarativeItem puis je l'ajoute a la QGraphicsScene. L'ajout d'un texte simple fonctionne mais pas celui de mon composant.

    Qu'est ce que j'ai oublié (ou mal compris dans le fonctionnement)?

    Merci d'avance


    PS:Ceci est l'exemple de la doc. La méthode paint fonctionne puisque dans l'exemple 1 le piechart s'affiche correctement.

  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
    Bonsoir,

    Dans un premier temps, je te conseillerais plutôt d'utiliser une QDeclarativeView à la place d'une QGraphicsScene dans le sens où c'est le widget adapté à la lecture de fichier QML. La gestion des éléments QML ne se fait pas du tout comme ce que l'on faisait avec le module 2D de Qt avant l'arrivée de QML, c'est bien plus pratique.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart");

    Avec ce code, tu signales à QML que tu peux utiliser un nouvel élément nommé PieChart comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import Charts 1.0 // Tel que défini dans ton qmlRegisterType
     
    PieChart {
        // ...
    }
    Si tu lui définis une width et une height adaptées, tu auras sans doute un rendu à l'écran.

    Bonne continuation,
    Amnell.
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Par défaut
    Merci pour ta réponses mais il y a certaines choses qui restent floues.

    Il me semble que Qt fonctionne suivant Modele-Vue j'utilise donc QDeclarativeView comme une Vue et QGraphicsScene. Je n'ai rien lu qui permette de se passer de la QGraphicsScene.

    Dans ton exemple, tu utilise le type PieChart dans un fichier QML et ajoute donc en dur tes composants. Or je ne sais ni combien je vais avoir d'éléments ni lesquels je ne peux donc pas faire ceci (a moins que l'on puisse le faire depuis le C++ ).
    Lorsque j'utilise ta méthode je parviens tout a fait a afficher le type que je souhaite mais il me manque la possibilité d'en ajouter suivant la demande de l'utilisateur.


    J'ai réussi a afficher plusieurs composants hier soir de la facon suivante:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        QDeclarativeEngine *engine = new QDeclarativeEngine;
        QDeclarativeComponent component(engine, QUrl("qrc:/app.qml"));
        QDeclarativeItem *object = qobject_cast<QDeclarativeItem*>(component.create());
        QDeclarativeComponent component_2(engine, QUrl("qrc:/app.qml"));
        QDeclarativeItem *object_2 = qobject_cast<QDeclarativeItem*>(component_2.create());
        scene->addItem(object_2);
        scene->addItem(object);
        object->setPos(200,200);
    En revanche je ne parviens pas a acceder aux méthodes que j'ai écrites comme setName.
    Lorsque j'utilise explicitement le constructeur de ma classe comme l'exemple de mon premier post je peux utiliser la méthode setName.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    PieChart *pie = new PieChart();


    Je pense que je ne suis pas loin mais soit je ne parviens pas a afficher le composant soit je ne parviens pas a acceder a ses méthodes.

  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
    Salut,

    Le problème que tu as est que tu as une vision C++ de la chose, tu ne fais pas l'abstraction de ce que tu connais pour passer dans le langage déclaratif.

    Ce qu'il faut que tu fasses est que tu utilises un seul et unique QDeclarativeView et que tu codes tout en QML. Côté QML, rien n'est statique : tu peux utiliser des ListModel avec la fonction append() pour créer plusieurs éléments (je te recommande cette solution), tu peux utiliser Qt.createComponent() pour créer un nouveau composant (je ne te recommande pas cette solution vu que le retrait des éléments n'est pas évident), utiliser le composant Loader pour charger un fichier QML (pratique dans certains cas, mais pas particulièrement dans le tien), etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ListModel {
        id: myListModel
    }
     
    MyButton {
        text: "Ajouter"
        onClicked{
            myListModel.append({"quelquechose": 6,
                "autrechose": "bleu"});
        }
    }
    Et tu utilises le ListModel dans un Repeater/[List/Grid]View pour gérer l'affichage. Dans le delegate de l'afficheur, tu mets ton PieChart et tu adaptes ses propriétés aux valeurs du ListModel.
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Par défaut
    Effectivement l’élément ListModel pourrait convenir étant donné que je souhaitais faire deux QList de mes éléments.
    J'essairai ca quand je pourrais.

    Il faut que je puisse également controler chacun de mes composants indépendamment des autres depuis le C++ (positions et autres propriétés), cela ne pose pas de problemes?

  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
    Tu peux de toutes façons utiliser les fonctions du ListModel dont set() et get() qui te permettront de faire ce que tu souhaites.
    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. Ajout dynamique de composant Ajax
    Par Ecosmose dans le forum ASP.NET Ajax
    Réponses: 12
    Dernier message: 22/03/2010, 10h11
  2. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 21/04/2008, 16h08
  3. [Matisse]Ajout dynamique de composants swing
    Par Pierre Maurette dans le forum NetBeans
    Réponses: 3
    Dernier message: 22/03/2007, 08h47
  4. Ajouter dynamiquement un composant préfixé
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/10/2006, 14h59
  5. [c#]ajout dynamique de composant
    Par chasse dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/10/2006, 07h21

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