|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour
Je viens de commencer de travailler avec QML et je voudrais savoir si le cas suivant est faisable avec QML: Je veux faire afficher un graph depuis C++ avec QML dans la facon suivante: - chaque noeud est répresant par une image graphique - par exemple une icone grahique .png - on peut clicker (right mouse click) sur un noeud et pouvoir faire des actions simples sur le noeud (changer son nom, afficher/cacher son apparance) - les noeuds sont connectés avec des lignes graphique et le graph est affiché dans une facon simple à visualiser. J'ai vu qu'il existe GridView dans QML, mais je ne sais pas si je peux peindre des lignes graphique entre les elements. Et aussi, si je peux re-arranger les noeuds dans une facon simple à visualiser. Est-ce que vous pouvez me donner votre avis SVP si cela est faisable avec QML et si oui avec lequels elements QML on pourrait le realiser ? Merci beaucoup d'avance ! |
|
|
00
|
|
|
#2 |
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonsoir,
C'est possible avec le module Qt Declarative de Qt (qui englobe QML) en réalisant du côté du C++ l'élément QML puis en l'exploitant du côté du QML. Pour les nœuds, il s'agirait d'un ListModel avec dedans les informations, affiché par un Repeater par-dessus l'élément QML du graphe. Je peux vous fournir un exemple si cette méthode vous intéresse. Pour la classe C++ du graphe elle-même, je vous propose d'étudier un code que j'avais donné précédemment : http://www.developpez.net/forums/d12...s/#post6744642 Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
Oui, je suis intéressé pour cette solution. J'aimerais avoir un exemple Stp. P.S. et surtout comment créer dynamiquement les objets QML Node a partir de C++ et les connecter avec des lignes ? Merci |
|
|
00
|
|
|
#4 | ||||||||
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonsoir,
Rapidement : Code :
Par rapport à votre question : comment créer des éléments directement depuis le C++, l'idéal serait de passer par une contextProperty() : Code :
Code :
Code :
Il y a bien sûr d'autres solutions mais j'ai préféré vous présenter celle-ci. Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
||||||||
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Merci beaucoup.
Comment tu peindre des lignes qui connectent les noeud ? |
|
|
00
|
|
|
#6 | ||||||
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonjour,
L'objectif est d'avoir ceci ? Code :
Code :
Code :
Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
||||||
|
10
|
|
|
#7 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Salut,
Ton exemple est très bien, mais je ne comprends pas comment tu peux peindre une ligne qui connecte deux noeuds (dans ton cas le noeud est un rectangle avec un text) ? Merci |
|
|
00
|
|
|
#8 |
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonsoir,
Dans le cas présent, le nœud va être le rectangle avec une bordure qui contient un Text dedans. Pour la ligne, c'est le rectangle d'épaisseur 1px de couleur noire. Après, si on souhaite dessiner des lignes qui ne sont pas droites ou horizontales/verticales (ce qui pourrait être reproduit avec un Rectangle), soit on crée une classe côté C++ dont la fonction paint dessine une ligne bêtement avec un QPainter, soit on utilise http://qt.gitorious.org/qt-labs/qmlcanvas. Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
J'ai arrivé de créer des eléments Nodes dans un Repeater et les place comme je veux grace aux parametres posX et posY. Maintenat je veux peindre une ligne entre certains elements. Du coup, j'ai implementer la methode paint() de la classe C++ Node: Code :
Est-ce que tu sais comment ca marche avec la methode paint(). Quand elle est appellée et comment on peut l'appeler exprès ? Ca marche avec un signal specifique ? Merci d'avance |
||
|
|
00
|
|
|
#10 | ||||
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonsoir,
Vous avez dû oublier ceci : Attention cependant, la classe C++ "Node" est une toute autre chose que l'élément QML "Node". L'intérêt de QML reste d'avoir la logique du côté du code C++ et la partie graphique du côté du code QML. De ce fait, je vous proposerais plutôt de créer un élément "Link" qui permet de relier deux nœuds entre eux... et du côté du QML. La partie C++ permettra uniquement de coder le paint et d'ajouter quelques propriétés : Code :
Code :
qmlRegisterType<Link>("MyLib", 1, 0, "Link"); Code :
Bonne soirée, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
||||
|
10
|
|
|
#11 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
Pour l'instant je vais laisser la creation des liens (lignes) dans la methode paint() de Node.cpp J'ai bien mis setFlag(xxxxxx, false) dans le constructeur de Node. Mais je ne vois pas des lignes dessinées. J'ai tracé le code, je passe bien par la methode paint(), mais par contre je passe plusieurs fois, pas seulement 3 fois (j'ai trois objets Node). Et chaque fois le pointer this pointe vers un objet vide de type Node et pas vers le vrai object Node, que j'ai créé avant. Je ne comprends pas pourqoui on appelle paint avec un this qui pointe vers un objet vide. Tu as une idée ? Merci d'avance |
|
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
J'ai trouvé le probleme. En fait, QML appelle paint() sur une instance de Node.cpp, qui est vide. Apres QML copie les properties de C++ qui sont declaré comme roles ou Q_Properties. Donc, j'ai crée une role en plus -> parentNodes /QList<Node*> dans le Node.cpp/ qui contient tous les parents d-un node. Donc, je veux desinner une ligne pour chaque membre dans parentNodes dans la fonctionne onCompleted, alors il faut faire dans Node.qml Component.onCompleted: { for each in parentNodes, draw line posX, posY to iteratorEachInParentNodes.posX, posY} Mais je ne connais pas le syntax. Tu peux m'aider un peu stp ? Merci d-avance [edit] Peut etre qqchose comme: Code :
Mais cela ne se compile pas. Je ne connais pas le syntax exact ... Tu as une idée ? |
||
|
|
00
|
|
|
#13 |
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonsoir,
Le fait que la méthode paint() soit appelée plusieurs fois signifie qu'il y a eu plusieurs demandes de peinture (du genre, un élément situé au-dessus a demandé à être repeint, ce qui a engendré une repeinture de l'élément, ou bien vous avez masqué la fenêtre et l'avez réaffiché, etc.). D'ailleurs, je m'aperçois que j'ai oublié de rajouter les demandes de repeinture dans les fonction set[...]X/Y() de la classe de l'exemple que j'ai donné dans mon précédent post. La fonction onCompleted est appelée une seule fois, au moment où l'élément a fini d'être chargé. De ce fait, ce n'est pas nécessairement ce handler qui vous intéresse. Pourrais-je voir le code source de l'élément Node (celui qui a dû recevoir un qmlRegisterType et qui contient la méthode paint() - à moins que ce ne soit Node.qml qui crée l'élément, auquel cas j'aimerais voir la classe avec le paint()) ? Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
|
00
|
|
|
#14 | ||||||||||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Salut,
Voici le code source: main.qml Code :
Code :
Code :
Node.h Code :
Code :
Je suis blocké et je ne peux avancer a cause de ce problème avec dessin de lignes entre les noeuds. |
||||||||||
|
|
00
|
|
|
#15 | ||
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonjour,
Dans votre classe Node, plutôt que de passer par des fonction Q_INVOKABLE, vous devriez passer par des propriétés, ce qui vous permettrait d'opérer dynamiquement plutôt que d'avoir à appeler vous-même les fonctions lors de changements. Là, l'intérêt semble de relier les Nodes entre eux. En admettant que les méthodes connectTo() et disconnectTo() - en ajoutant update() pour avoir droit à un appel à paint() - prenant en paramètre un Node* soient Q_INVOKABLE, on pourrait envisage un Component.onCompleted du main.qml : Code :
Code :
configModel.get(selectedNode).connectTo(configModel.get(index)); Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
||
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
C-est bien cette proposition. Par contre dans ton exemple, tu fais connection entre le node courrant et tous ces précedant noeud. Moi, je veux qu'il y a la possibilité de faire connection entre le noeud courrant et certains des noeuds (qui sont marqués dans sa liste _parents). Ca je ne sais pas comment faire, sinon exemple est bon. Merci beaucoup |
|
|
00
|
|
|
#17 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Bonjour,
J'ai essayé de faire main.qml comme tu as proposé: Code :
Ca veut dire, que configModel.count est 0 au moment d'appeler onCompleted. C'est bizarre quand meme ... Sinon, je trouve l'idée comme bonne. Juste comme j'ai ecrit dans mon message précédant, je veux connecter dynamiquement un noeud donné à un certain nombre de noeud spécifiés Par exemple, une configuration de 3 noeud: - noeud 1 - non connecté - noeud 2 - non connecté - noeud 3 - connecté à noeud 1 |
||
|
|
00
|
|
|
#18 |
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonjour,
Le problème vient probablement du fait que le modèle soit vide ou bien que sa fonction count() retourne 0, n'ayant pas été réimplémentée dans le C++. Par contre, je vous conseillerais plus de gérer vos Nodes du côté du QML, cela éviterait de mélanger le model et la view comme cela. Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 13 ![]() |
Oui, mon idée était de faire le dessin des connections par la fonction paint(), mais le probleme est que cette fonction est appellé dans QML a partir d'une instance vide de la classe Node.
QML crée des instances de Node a partir de Node() et ils sont vides. Apres plus tard QML copie des properties (roles) a partir du model. Donc, quand paint() est appellé, la liste _parents est vide et je ne peux pas dessiner les liens. Tu as une idée ? |
|
|
00
|
|
|
#20 | ||
![]() ![]() Louis du VerdierÉtudiant Inscription : mars 2009 Messages : 1 600 ![]() |
Bonjour,
L'idéal serait d'avoir un modèle contenant les informations - non les Nodes eux-mêmes - permettant de créer les Nodes et de les relier ultérieurement entre eux par la suite. Code :
Bonne continuation, Amnell.
__________________
Qt : FAQ Qt - Qt Quarterly - Ma page perso - La documentation de Qt en français Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL) Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com