Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Position d'un bouton dans une Qscene

Débutant en QT, j'utilise une librairie que d'autres ont préparé pour créer des logiciels éducatifs.
Cette classe permet de gérer des boutons de manière plus intuitive et de nous faciliter le drag and drop par exemple.
Or, je n'arrive pas à placer convenablement les boutons sur le fond voulu.
J'obtiens comme un décallage.
Les boutons que je veux placer à 200, 200 se retrouvent à 400, 400 sur mon fond et je ne comprends pas pourquoi.
Si quelqu'un avait la gentillesse de ce pencher sur mon bout de code.

Je mets tout le code utile, pour ne rien oublier.

Voici la classe abuledubouton utilisée :
abuleduboutonv0.h
/**
* Classe AbulEduBoutonV0 qui permet de créer des boutons graphiques dans des
* QGraphicsScene ...
*
* @see https://redmine.ryxeo.com/projects/ryxeo/wiki/Utilisation_de_abuleduboutonv0
* @author 2009-2010 Philippe Cadaugade <philippe.cadaugade@ryxeo.com>
* @author 2010 Eric Seigne <eric.seigne@ryxeo.com>
* @see The GNU Public License (GNU/GPL v2)
*/

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#ifndef ABULEDUBOUTONV0_H
#define ABULEDUBOUTONV0_H
#include <QGraphicsObject>
#include <QPropertyAnimation>
//#include <QWidget>


/** Notez le double heritage sur QPushButton et QGraphicsItem ... */
class AbulEduBoutonV0 : public QGraphicsObject
{
Q_OBJECT
//Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)

public:
AbulEduBoutonV0(QString name,QWidget* parent=0);
~AbulEduBoutonV0();
/** Permet d'affecter une image au bouton */
void setImage(QPixmap);
/** Permet d'affecter l'image normale du bouton */
void setImageNormal(QPixmap);
/** Permet d'affecter l'image du bouton lorsqu'il est selectionne */
void setImageSelect(QPixmap);
/** Permet de recuperer l'image en cours */
QPixmap* getImage();
/** Permet de passer de l'image normale a l'image selectionnee */
void switchImage(int);

/** Permet de passer le abuleduboutonv0 en mode debug ... */
void setDebug(bool i);
/** Permet de modifier la taille du bouton */
void resize(QSize*);
void resize(int w,int h);
/** Permet d'associer une animation a un bouton */
void setAnimation(QPropertyAnimation* animation);

/** Permet d'associer de recuperer l'animation associee au bouton et de la controler */
QPropertyAnimation* getAnimation();

/** Methodes internes */
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);

protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
void dropEvent(QGraphicsSceneDragDropEvent *event);
void dragMoveEvent(QGraphicsSceneDragDropEvent *event);


signals:
void clicked(bool checked = false);

private:
QPixmap* m_image; // L'image actuellement affichée
QPixmap* m_imageNormal; // L'image normale
QPixmap* m_imageSelect; // L'image quand l'objet est selectionné
QSize* m_size; // La taille
bool m_localDebug; // Le mode debug pour "voir" les boutons
bool m_highlight; // Es-ce que cette zone est survollée ?
QPropertyAnimation* m_animation; // Quelle est l'animation qui est accrochée à ce bouton ?
};

#endif // ABULEDUBOUTONV0_H
et son .ccp
abuleduboutonv0.cpp
/**
* Classe AbulEduBoutonV0 qui permet de créer des boutons graphiques dans des
* QGraphicsScene ...
*
* @see https://redmine.ryxeo.com/projects/ryxeo/wiki/Utilisation_de_abuleduboutonv0
* @author 2009-2010 Philippe Cadaugade <philippe.cadaugade@ryxeo.com>
* @author 2010 Eric Seigne <eric.seigne@ryxeo.com>
* @see The GNU Public License (GNU/GPL v2)
*/

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#include "abuleduboutonv0.h"
#include <QtGui>
#include <QDebug>
#include <QMimeData>


AbulEduBoutonV0::AbulEduBoutonV0(QString name, QWidget* parent)
: QGraphicsObject()
{
//On accepte d'être drag&droppé
setAcceptDrops(true);

//Initialisation
m_image = new QPixmap("");
m_imageNormal = new QPixmap("");
m_imageSelect = new QPixmap("");
m_localDebug = false;
m_size = new QSize(50,50);
m_highlight = false;
m_animation = new QPropertyAnimation();
this->setObjectName(name);
this->setPos(0,0);
//Rq: Cas particulier, ca ne sert jamais vu qu'on initialise le m_localDebug a false juste avant !
if(m_localDebug)
{
if (parent) qDebug() << "abuleduboutonv0.cpp: Parent du bouton : " << parent->objectName();

}
setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}

AbulEduBoutonV0::~AbulEduBoutonV0()
{
}

void AbulEduBoutonV0::resize(QSize *s)
{
m_size = s;
}

void AbulEduBoutonV0::resize(int w, int h)
{
m_size = new QSize(w,h);
}

void AbulEduBoutonV0::setAnimation(QPropertyAnimation* a)
{
m_animation = a;
}

QPropertyAnimation* AbulEduBoutonV0::getAnimation()
{
return m_animation;
}

void AbulEduBoutonV0::setImage(QPixmap image)
{
*m_image = image;
if(m_localDebug)
{
qDebug() << "abuleduboutunv0.cpp: setImage, taille de l'image: " << image.size();
}
update(this->x(), this->y(), m_size->width(), m_size->height());
}

void AbulEduBoutonV0::setImageNormal(QPixmap image)
{
*m_imageNormal = image;
if(m_localDebug)
{
qDebug() << "abuleduboutunv0.cpp: setImageNormal, taille de l'image: " << image.size();
}
}

void AbulEduBoutonV0::setImageSelect(QPixmap image)
{
*m_imageSelect = image;
if(m_localDebug)
{
qDebug() << "abuleduboutunv0.cpp: setImageSelect, taille de l'image: " << image.size();
}
}

QPixmap* AbulEduBoutonV0::getImage()
{
return m_image;
}


void AbulEduBoutonV0::switchImage(int i)
{
if(i == 0)
m_image = m_imageNormal;
else
m_image = m_imageSelect;
if(m_localDebug)
{
qDebug() << "abuleduboutunv0.cpp: switchImage";
}
update(this->x(), this->y(), m_size->width(), m_size->height());
}

QRectF AbulEduBoutonV0::boundingRect() const
{
return QRectF(this->x(),this->y(), m_size->width(), m_size->height());
}

void AbulEduBoutonV0::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
QRect rect(this->x(), this->y(),45,45);// this->width(), this->height());
//quand on est en mode debug on affiche le cadre autour de la zone sensible pour "voir" ou on est ...
if(m_localDebug)
{
painter->setPen(Qt::black);
painter->drawRect(rect.adjusted(0, 0, -1, -1));
}

if(m_highlight)
{
painter->setBrush(QColor("#ffcccc"));
painter->setPen(Qt::NoPen);
painter->drawRect(rect.adjusted(0, 0, -1, -1));
}

painter->drawPixmap(rect, *m_image);
}

void AbulEduBoutonV0::mousePressEvent(QGraphicsSceneMouseEvent* e)
{
QMimeData *mimeData = new QMimeData;
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << this->objectName();

mimeData->setData("image/x-AbulEduBoutonV0",itemData);
QDrag *drag = new QDrag(e->widget());
drag->setMimeData(mimeData);
drag->start();

if(m_localDebug)
{
qDebug() << "abuleduboutunv0.cpp clic detecte sur le bouton souris n°" << e->button();
}
switch(e->button())
{
//On passe l'event au graphicItem
case Qt::LeftButton:
emit(clicked(true));
break;
case Qt::RightButton:
//a faire quand on voudra gerer les clics bouton droit
break;
default:
/* do nothing */
break;
}
}

void AbulEduBoutonV0::setDebug(bool i)
{
m_localDebug = i;
}

void AbulEduBoutonV0::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if (event->mimeData()->hasFormat("image/x-AbulEduBoutonV0"))
{
QByteArray pieceData = event->mimeData()->data("image/x-AbulEduBoutonV0");
QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
QString nom;
dataStream >> nom;

//Si le recepteur est différent de l'emmeteur il faut échanger les caractéristiques (?)
if(nom != this->objectName())
{
m_highlight = true;
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
m_highlight = false;
event->ignore();
}
}
else
{
m_highlight = false;
event->ignore();
}
update();
}

void AbulEduBoutonV0::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
m_highlight = false;
update();
}

void AbulEduBoutonV0::dropEvent(QGraphicsSceneDragDropEvent *event)
{
qDebug() << "signal recu sur " << this->objectName();

QByteArray pieceData = event->mimeData()->data("image/x-AbulEduBoutonV0");
QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
QString nom;
dataStream >> nom;

//Si le recepteur est différent de l'emmeteur il faut échanger les caractéristiques (?)
if(nom != this->objectName())
{
m_highlight = true;
qDebug() << "signal emis par " << nom;
//AbulEduBoutonV0 * origine = qApp->findChild<AbulEduBoutonV0 *>(nom);
//qDebug() << "on a trouve ... " << origine->objectName();
//this->setImage(*origine->getImage());
}
else
{
m_highlight = false;
}

}

void AbulEduBoutonV0::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
if (event->mimeData()->hasFormat("image/x-AbulEduBoutonV0"))
{
QByteArray pieceData = event->mimeData()->data("image/x-AbulEduBoutonV0");
QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
QString nom;
dataStream >> nom;

//Si le recepteur est différent de l'emmeteur il faut échanger les caractéristiques (?)
if(nom != this->objectName())
{
m_highlight = true;
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
m_highlight = false;
event->ignore();
}
}
else
{
m_highlight = false;
event->ignore();
}
update();
}
mon main.cpp appelle la classe bootSplash

qui contient :

bootsplash.h
/**
* Projet À nous les nombres 2010
* @see https://redmine.ryxeo.com/projects/leterrier-anouslesno/
* @author 2010 Eric Seigne <eric.seigne@ryxeo.com>
* @see The GNU Public License (GNU/GPL) v3
*
*
*
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef BOOTSPLASH_H
#define BOOTSPLASH_H

#include <QtGui/QDialog>
#include "common/abuleduboutonv0.h"

namespace Ui {
class bootSplash;
}

class bootSplash : public QDialog {
Q_OBJECT
Q_DISABLE_COPY(bootSplash)
public:
explicit bootSplash(QWidget *parent = 0);
virtual ~bootSplash();

protected:
virtual void changeEvent(QEvent *e);

private:
Ui::bootSplash *m_ui;

private slots:
void btnNextClicked();
};

#endif // BOOTSPLASH_H
bootsplash.cpp
#include "bootsplash.h"
#include "anouslesnombres.h"
#include "ui_bootsplash.h"
#include "common/abuleduboutonv0.h"

bootSplash::bootSplash(QWidget *parent) :
QDialog(parent),
m_ui(new Ui::bootSplash)
{
m_ui->setupUi(this);


QGraphicsScene* dessin = new QGraphicsScene(this);
m_ui->grvSplash->setScene(dessin);
//Positionne l'origine des objets ajoutés dans le QGraphicsView avec le (0,0) en haut à gauche...
//... il est au centre du QGraphicsView sinon
m_ui->grvSplash->setAlignment(Qt::AlignLeft | Qt::AlignTop);
m_ui->grvSplash->setSceneRect(QRectF(0,0,1024,550));

this->setWindowFlags(Qt::SplashScreen);

QPixmap imgFond(QCoreApplication::applicationDirPath()+"/data/images/splash.jpeg");
dessin->addPixmap(imgFond);

AbulEduBoutonV0 * bouton = new AbulEduBoutonV0("next");

bouton->QGraphicsItem::setCursor(Qt::PointingHandCursor);
// bouton->setDebug(true);
bouton->setPos(230,240);
bouton->resize(64,47);
dessin->addItem(bouton);

connect(bouton,SIGNAL(clicked()),this,SLOT(btnNextClicked()));
}

bootSplash::~bootSplash()
{
delete m_ui;
}

void bootSplash::changeEvent(QEvent *e)
{
switch (e->type()) {
case QEvent::LanguageChange:
m_ui->retranslateUi(this);
break;
default:
break;
}
}

void bootSplash::btnNextClicked()
{
aNousLesNombres *w = new aNousLesNombres(this);
w->show();
this->hide();
}
Et là, je ne comprends pas pourquoi le bouton s'affiche au centre alors que ses coordonnées sont placées en 230,240.

image


Merci de votre aide bienveillante, je débute en QT.
Connectez-vous ou Inscrivez-vous pour répondre.