Bienvenue sur le forum !

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

Qt : 5.10.0 - Qt Creator : 4.5.0 - Qt Installer : 3.0.2 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

GraphicsView et curseur...

1 Dec modifié dans Qt / Langage C++
Bonjour,
Poursuivant mon projet, je reviens poser une question à propos de la relation curseur/couleur du point sous le curseur:
Voilà, j'affiche une image (QPixmap d'une image dans un fichier) dans une scene insérée dans une instance dérivée de QGraphicsView (pour gérer les évenements souris).

Lorsque je déplace le curseur souris affiché dans l'image, un clic gauche m'affiche, dans un QTextEdit à droite de l'image:
- la position % scene
- la couleur RGB du point sous le curseur

Jusqu'à là tout est correct (si je modifie la fenêtre, les données affichées restent valables)

Si j'entre maintenant au clavier, les coordonnées du point relevées précédemment et que je les utilise pour déplacer le curseur à la position correspondante sur l'image, je retrouve bien la position.

Mais là où je ne suis plus, c'est que la couleur affichée pour cette position n'est plus celle que j'avais relevée précédemment!
Qu'ai-je donc omis?

NB: en vérifiant dans Illustrator la couleur RGB ainsi affichée (0,48,57), je trouve un gris foncé ressemblant étrangement à celui du fond d'écran du bureau (?)
/* GView 30/11/2017 - test position curseur dans une image affichée dans une QGraphicsView
*
* 1- on affiche une image
* 2- on clique sur un motif et on affiche la position curseur (%scene) et la couleur du point cliqué
* 3- on teste un positionnement dans l'image à partir des coordonnées (%scene) relevées précédemment
* et entrées au clavier dans le champ texte.
**/

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

m_scene = new QGraphicsScene;
ui->gView->setScene(m_scene);
ui->gView->setCursor(Qt::CrossCursor);

connect(ui->pushButton,SIGNAL(clicked()),this, SLOT(doIt()));
connect(ui->gView,SIGNAL(pressed(QPoint)),this,SLOT(showPos(QPoint)));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::doIt()
{
bool ok = m_pix.load("image.svg");
if (ok)
m_scene->addPixmap(m_pix);//ajoute l'image
}

void MainWindow::showPos(QPoint p)
{
ui->tText->append(QString("From gView (pressEvt): %1,%2").arg(p.x()).arg(p.y()));
QPointF sceneP = ui->gView->mapToScene(p);
ui->tText->append(QString("mapToScene: %1,%2").arg(sceneP.x()).arg(sceneP.y()));

QImage image = m_pix.toImage();
QRgb rgb = image.pixel(sceneP.toPoint());
ui->tText->append(QString("color: %1,%2,%3").arg(QColor(rgb).red()).arg(QColor(rgb).green()).arg(QColor(rgb).blue()));
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Return)
{
QStringList list = ui->lText->text().split(',');
QPoint p(list[0].toInt(),list[1].toInt());
ui->tText->append(QString("Coords: %1,%2").arg(p.x()).arg(p.y()));/*coordonnées du point à situer
issues de mousePressEvent()*/

QPoint viewP = ui->gView->mapToGlobal(p);//convertir en position dans viewport
QPoint sceneP = ui->gView->mapFromScene(viewP);//convertir en position scene
QCursor curs(ui->gView->cursor());
curs.setPos(sceneP);//positionne le curseur (ex. milieu du rectangle de l'image 63,62)
QImage image = m_pix.toImage();

QRgb rgb = image.pixel(curs.pos());//affiche la couleur pointée par le curseur
ui->tText->append(QString("color: %1,%2,%3").arg(QColor(rgb).red()).arg(QColor(rgb).green()).arg(QColor(rgb).blue()));
}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
QPixmap m_pix;
QGraphicsScene *m_scene;

protected:
void keyPressEvent(QKeyEvent *event);

public slots:
void doIt();
void showPos(QPoint p);
};

#endif // MAINWINDOW_H
#ifndef MYVIEW_H
#define MYVIEW_H

#include <QGraphicsView>
#include <QMouseEvent>

class MyView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QObject *parent = 0);

signals:
void pressed(QPoint p);

public slots:

protected:
void mousePressEvent(QMouseEvent *event);

};

#endif // MYVIEW_H
#include "myview.h"

MyView::MyView(QObject *parent) : QGraphicsView()
{
}

void MyView::mousePressEvent(QMouseEvent *event)
{
if(frameRect().contains(event->pos()))
emit pressed(event->pos());

}
jpg
jpg
GView.jpg
32K
Connectez-vous ou Inscrivez-vous pour répondre.