Damier avec fond graphique

Placement du fond

private:

   Ui::MainWindow *ui;

   QGraphicsScene *scene;

   QGraphicsPixmapItem *fond;

MainWindow::MainWindow(QWidget *parent) :

   QMainWindow(parent),

   ui(new Ui::MainWindow)

{

   ui->setupUi(this);

   scene = new QGraphicsScene(this);

   scene->setSceneRect(QRectF(0,0,400,400));

   ui->graphicsView->setScene(scene);

   fond = scene->addPixmap(QPixmap(":/images/damier.png"));

.........

}

Cela étant fait, l'exécution du programme permet de voir le damier. Il faut à présent arriver à obtenir les coordonnés des clics de la souris.

Obtention des coordonnées des clics souris

graphicsView ne dispose pas de signaux liés à l'action de la souris, il faut donc utiliser la bibliothèque QMouseEvent pour obtenir les informations de la souris.

#include <QMainWindow>

#include <QGraphicsScene>

#include <QMouseEvent>


namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

   Q_OBJECT


public:

   explicit MainWindow(QWidget *parent = 0);

   ~MainWindow();


public slots:

   void on_actionQuitter_triggered();

   void placerPionBleu();

   void mousePressEvent(QMouseEvent * e);


signals:

    void mousePressed();


private:

   Ui::MainWindow *ui;

   QGraphicsScene *scene;

   QGraphicsPixmapItem *fond;

    int pressedX;

   int pressedY;

};

void MainWindow::mousePressEvent(QMouseEvent * e)

{

QPointF pt = ui->graphicsView->mapToScene(e->pos());//récupération de la position

pressedX=pt.x()-30;                                                           //adaptation à la position : pressedX

pressedY=pt.y()-100;                                                         //adaptation à la position : pressedY

emit mousePressed();                                                      //émission du signal pour déclencher le slot

}

//-------------------------------------------------------------------------------

void MainWindow::placerPionBleu()

{

            //code de traitement

}

MainWindow::MainWindow(QWidget *parent) :

   QMainWindow(parent),

   ui(new Ui::MainWindow)

{

   ui->setupUi(this);

   QObject::connect(this, SIGNAL(mousePressed()), SLOT(placerPionBleu()));

...............

}

Comment dessiner un pion

class MainWindow;

}

class MainWindow : public QMainWindow

{

   Q_OBJECT


........

private:

   Ui::MainWindow *ui;

   QGraphicsScene *scene;

   QGraphicsEllipseItem *pionRouge;

   QGraphicsPixmapItem *fond;

   QBrush *redBrush;

   QPen *blackPen;

   int pressedX;

   int pressedY;

   void placerPionRouge(int coord);

   int position=0;

};

MainWindow::MainWindow(QWidget *parent) :

   QMainWindow(parent),

   ui(new Ui::MainWindow)

{

   ui->setupUi(this);

   QObject::connect(this, SIGNAL(mousePressed()), SLOT(placerPionBleu()));

   scene = new QGraphicsScene(this);

   scene->setSceneRect(QRectF(0,0,400,400));

   ui->graphicsView->setScene(scene);

   fond = scene->addPixmap(QPixmap(":/images/damier.png"));

   redBrush = new QBrush();

   blackPen = new QPen();

   redBrush->setColor(Qt::red);

   blackPen->setColor(Qt::black);

   blackPen->setWidth(4);//largeur du pinceau

   redBrush->setStyle(Qt::SolidPattern);//type solid

}

pionRouge = scene->addEllipse(coordX,coordY,40,40,*blackPen,*redBrush);

Où coordX et coordY sont les positions supérieurs gauche du pion de diamètre 40 pixels.


Le code complet

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>

#include <QGraphicsScene>

#include <QMouseEvent>


namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

   Q_OBJECT


public:

   explicit MainWindow(QWidget *parent = 0);

   ~MainWindow();


public slots:

   void on_actionQuitter_triggered();

   void on_pushButton_clicked();

   void placerPionBleu();

   void mousePressEvent(QMouseEvent * e);


signals:

    void mousePressed();


private:

   Ui::MainWindow *ui;

   QGraphicsScene *scene;

   QGraphicsEllipseItem *pionRouge;

   QGraphicsEllipseItem *pionBleu;

   QGraphicsPixmapItem *fond;

   QBrush *redBrush;

   QBrush *blueBrush;

   QPen *blackPen;

   int pressedX;

   int pressedY;

   void placerPionRouge(int coord);

   int position=0;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :

   QMainWindow(parent),

   ui(new Ui::MainWindow)

{

   ui->setupUi(this);

   QObject::connect(this, SIGNAL(mousePressed()), SLOT(placerPionBleu()));//un clic sur la grille place un pion bleu

   scene = new QGraphicsScene(this);

   scene->setSceneRect(QRectF(0,0,400,400));//taille de la grille 400x400

   ui->graphicsView->setScene(scene);

   fond = scene->addPixmap(QPixmap(":/images/damier.png"));

   redBrush = new QBrush();

   redBrush->setColor(Qt::red);

   redBrush->setStyle(Qt::SolidPattern);//remplissage complet en rouge

   blueBrush = new QBrush();

   blueBrush->setColor(Qt::blue);

   blueBrush->setStyle(Qt::SolidPattern);//remplissage complet en rouge

   blackPen = new QPen();    

   blackPen->setColor(Qt::black);

   blackPen->setWidth(4);//largeur du pinceau

}


MainWindow::~MainWindow()

{

   delete ui;

}

//----------------------------------------------------------------------------------------------------

void MainWindow::on_actionQuitter_triggered()

{

   close();

}

//----------------------------------------------------------------------------------------------------

void MainWindow::placerPionRouge(int coord)

{

   pionRouge = scene->addEllipse(5+coord*50,5+coord*50,40,40,*blackPen,*redBrush);

}

//----------------------------------------------------------------------------------------------------

void MainWindow::on_pushButton_clicked()

{  //place un pion rouge en diagonal à chaque clic sur le bouton jeu

   placerPionRouge(position);

   position++;

}

//----------------------------------------------------------------------------------------------------

void MainWindow::mousePressEvent(QMouseEvent * e)

{

QPointF pt = ui->graphicsView->mapToScene(e->pos());

pressedX=pt.x()-30;

pressedY=pt.y()-100;

pressedX=5+50*(pressedX / 50); //positionnement correct du pion en X

pressedY=5+50*(pressedY / 50);//positionnement correct du pion en Y

emit mousePressed();

}

//----------------------------------------------------------------------------------------------------

void MainWindow::placerPionBleu()

{

   pionBleu = scene->addEllipse(pressedX,pressedY,40,40,*blackPen,*blueBrush);


}

//----------------------------------------------------------------------------------------------------