bonjour,
j'ai fait un bout de code avec un pote qui affiche des objets 2D.
pour cela on a :
- une fenêtre contenant une scène.
elle récupère les images d'un objet pour les afficher.
- une classe abstraite GraphicsObject : public QObject, public QGraphicsItem.
qui prend en paramètre une QListe<Qpixmap*> et crée un tableau de QGraphicsPixmapItem
- des classes Magiciennes, Nuages... héritants de GraphicsObject
-un PixSender, qui stocke toutes les pixmap utiles à l'application dans des tableaux de QPixmap et les renvoie à un objet GraphicsObject lors de sa création.
voilà pour la petite histoire.
les sources ici : http://leszenfoires.fr/jdr
mais puisque mes objets graphiques héritent de QGraphicsItem, ne serait-il pas mieux d'ajouter directement un de ces objets à la scene ?
de faire scene->additem(magicienne); au lieu de scene->addPixmap(magicienne->getpixmap());
(magicienne étant un objet graphique)
ça ne renvoie pas d'erreur mais évidemment ça n'affiche rien.
je ne défini aucun parent dans le programme.
ça pourrait venir de là ?
ou peut être faire un truc du style magicienne->setPixmap(pixmapcourante)
(mais un QGraphicsItem n'a pas de membre setPixmap() )
enfin bref je ne trouve pas comment faire.
mon but final étant de pouvoir récupérer les events souris et clavier sur les objets.
une petite idée ?
GraphicsObject.h
GraphicsObject.cpp
Code : 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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 /* Classe Abstraite pour tous les objets graphiques réimplémenter initpixList qui sert à afficher l'objet */ #ifndef HEADER_GRAPHICSOBJECT #define HEADER_GRAPHICSOBJECT #include <QGraphicsPixmapItem> #include <iostream> #include <QMouseEvent> #include "PixSender.h" #include <QPainter> typedef struct M_Current{ M_Current(int a,QString s) { image=a; state=s; } int image; QString state; }MCurrent; //cette structure permet de situer à quelle image et dans quelle position se trouve un personnage("stand", "walk" ...) class GraphicsObject : public QObject, public QGraphicsItem { Q_OBJECT public: GraphicsObject(QList<QPixmap*> pixObject,QPointF position = QPointF(300,200), MCurrent current = MCurrent(0,"stand")) : mCurrentImage(current){ setPos(position); //defini la position d e l'objet mArea = pixObject.at(0)->size(); //récupère la taille de la premiere image pour boundingRect() et paint() }; virtual ~GraphicsObject(){}; virtual void initPixList(QList<QPixmap*> pixObject,QPointF position = QPointF(300,200)) = 0; void standAnimation(int max); MCurrent getCurrentImage(); QGraphicsPixmapItem* getPixmap(int i, QString state); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); // virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event); signals: void OnObject(); protected : QList <QGraphicsPixmapItem*> mStandPixmap; // tableau pour la position "stand" QList <QGraphicsPixmapItem*> mWalkPixmap; // tableau pour la position "walk" MCurrent mCurrentImage; QSize mArea; virtual void mousePressEvent(QGraphicsSceneHoverEvent * event); }; #endif
Code : 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 #include "GraphicsObject.h" #include <iostream> using namespace std; void GraphicsObject :: standAnimation(int max) { mStandPixmap.at(mCurrentImage.image)->setVisible(0); if (mCurrentImage.image==max-1) mCurrentImage.image = 0; else mCurrentImage.image ++; mStandPixmap.at(mCurrentImage.image)->setVisible(1); } QGraphicsPixmapItem* GraphicsObject :: getPixmap(int i, QString state) { if (state == "stand") return mStandPixmap.at(i); return mWalkPixmap.at(i); } QRectF GraphicsObject :: boundingRect() const { return QRectF(pos().x(),pos().y(),mArea.width(),mArea.height()); } void GraphicsObject :: paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { painter->drawRect(boundingRect()); }
Partager