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.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Problème avec un QPainter

Bonjour à tous,

Je doit réaliser un logiciel de manipulation d'image qui à pour but d'aligner plusieur photos et de réaliser une image hdr à partir de ces clichés.
Je travail avec QT 4.5 pour l'interface graphique et avec OpenCV pour les opérations sur les images.

Je suis en plein dans la partie alignement.

Je souhaite réaliser un zoom sur les images. Donc je réalise le zoom sur le QPainter et non sur les images (openCV ou QImage).
Mon problème c'est que lorsque je réalise le zoom mes images se décale de plus en plus vers le bas à droite.
J'en ai donc déduis qu'il y avait un problème. Soit les coordonnées de la souris ne sont pas dans le bon repére, soit l'origine du QPainter est déplacé à chaque zoom.
J'ai donc voulu trouver d'où venais le problème.
Mais je ne trouve pas ou se situe l'origine du QPainter par rapport à la fenêtre. Et de toute façon je récupère la position de la souris par event->pos() qui est sensé retourner la position de la souris dans le painter (si j'ai bien compris).

Et enfin j'ai voulu mettre un fond à mon QPainter pour voir si celui-ci se déplacé lors d'un zoom mais cela ne marche pas. Il n'y a aucune couleur de fond qui apparait.

Voilà je vous donne le code des fonctions concerné ainsi que le code de mon fichier .h correspondant si cela peut vous aider.
class EnsembleImage:public QWidget
{

/*!
* \brief
*
* \param
*
* \param
*
* Liste permettant de stocker et de gérer plusieurs image.
* cette collection est une liste du type QList.
*
* \param
*
* Index de l'image courante.
*
* \returns
*
*/
Q_OBJECT
private:
/**
* Liste permettant de stocker et de gérer plusieurs image.
* cette collection est une liste du type QList.
*/
QList<PImage *> *collectionImage;
/**
*
* Index de l'image courante.
*/
int indexCourant;
int modeSouris;
QRect rectangle;
int modeModif;
QPoint departDeplacement;
QPoint pointFixe[4];
int indexPtFixe;
QTransform *transform;
QPoint positionSouris;
int zoom;
public:
EnsembleImage(QWidget* parent=0);
~EnsembleImage();
void setAngle(float angle);
void addImage(QString nomFichier);
void changementIndexCourant(int i);
QList<PImage *>* getCollectionImage();
void deplPainterH(int translationX);
void deplPainterV(int translationY);
int getPlaceX();
int getPlaceY();
void transparenceImage();
void opaqueImage();
void setModeModif(int i);
void obtenirImage();
int count();
void shearX(float shx);
void shearY(float shy);
int getIndexPtFixe();
int getIndexCourant();
void zoomPainter(float val,QPoint e);
protected:
void paintEvent(QPaintEvent*);
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);
void mouseReleaseEvent(QMouseEvent* e);
void wheelEvent ( QWheelEvent * event );
signals:
void pointPlace();
void majComboBox();


};
EnsembleImage::EnsembleImage(QWidget* parent) : QWidget(parent)
{
collectionImage = new QList<PImage *>();
indexCourant = 0;
transform = new QTransform();
rectangle.setTopLeft(QPoint(0,0));
rectangle.setBottomRight(QPoint(0,0));
zoom = 1;
modeModif=0;
for(int i=0;i<4;i++){
pointFixe[i].setX(-1);
pointFixe[i].setY(-1);
}
indexPtFixe = 0;
modeSouris = NO_POINT;

}

void EnsembleImage::paintEvent(QPaintEvent*)
{

int tempIndexCourant=indexCourant;
assert(indexCourant>=0);
QPainter painter(this);

painter.setBackground(QBrush(Qt::red));
painter.setBackgroundMode(Qt::OpaqueMode);
painter.setTransform(*transform);
for(int i=0;i<collectionImage->size();i++)
{
if(i!=indexCourant)
painter.drawImage(collectionImage->at(i)->getPlaceX(), collectionImage->at(i)->getPlaceY(), *(collectionImage->at(i)->getQtImage()));
}
painter.drawImage(collectionImage->at(indexCourant)->getPlaceX(), collectionImage->at(indexCourant)->getPlaceY(), *(collectionImage->at(indexCourant)->getQtImage()));
for(int i=0;i<indexPtFixe;i++)
painter.drawEllipse(QRect(pointFixe[i],QSize(5,5)));
if(modeModif==2)
painter.drawRect(QRect(rectangle));
QString temp1,temp2;
temp1.setNum(positionSouris.x());
temp2.setNum(positionSouris.y());
painter.drawText(QPoint(10,10), "x = "+temp1+" y = "+temp2);
assert(indexCourant==tempIndexCourant);
}

void EnsembleImage::wheelEvent(QWheelEvent* e)
{
if(e->delta()>0){
zoomPainter(0.25,e->pos());
update();
}
else{
zoomPainter(-0.25,e->pos());
update();
}
}

void EnsembleImage::zoomPainter(float val,QPoint e)
{
transform->translate(-e.x()-10, -e.y()-10);
transform->scale(zoom+val, zoom+val);
transform->translate(e.x()+10, e.y()+10);
}
Je vous remercie d'avance.

Réponses

Connectez-vous ou Inscrivez-vous pour répondre.