UPDATE: C'è una nuova classe chiamata QGraphicsSceneMouseEvent
che rende questo un po 'più facile. Ho appena finito un esempio usando qui:
https://stackoverflow.com/a/26903599/999943
Differisce con la risposta qui sotto in quanto le sottoclassi QGraphicsScene
, non QGraphicsView
, e utilizza mouseEvent->scenePos()
quindi non v'è la necessità di mappare manualmente coordinate.
Sei sulla strada giusta, ma hai ancora un po 'di più da percorrere.
È necessario creare una sottoclasse di QGraphicsView
per poter eseguire operazioni con le presse del mouse o con il rilascio del mouse utilizzando QMouseEvent
.
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>
class MyQGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyQGraphicsView(QWidget *parent = 0);
signals:
public slots:
void mousePressEvent(QMouseEvent * e);
// void mouseReleaseEvent(QMouseEvent * e);
// void mouseDoubleClickEvent(QMouseEvent * e);
// void mouseMoveEvent(QMouseEvent * e);
private:
QGraphicsScene * scene;
};
QGraphicsView
non ha punti di dimensione nativi. Probabilmente vorrete usare l'articolo QGraphicsEllipse
o semplicemente, scene->addEllipseItem()
con un raggio molto piccolo.
#include "myqgraphicsview.h"
#include <QPointF>
MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
QGraphicsView(parent)
{
scene = new QGraphicsScene();
this->setSceneRect(50, 50, 350, 350);
this->setScene(scene);
}
void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
double rad = 1;
QPointF pt = mapToScene(e->pos());
scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,
QPen(), QBrush(Qt::SolidPattern));
}
nota l'utilizzo di mapToScene()
per rendere la pos()
della mappa evento correttamente al punto in cui il mouse si fa clic sulla scena.
È necessario aggiungere un'istanza della sottoclasse QGraphicsView
al layout del tuo ui di centralWidget se si intende utilizzare un modulo.
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget(new MyQGraphicsView());
o se l'interfaccia utente ha già un layout che sarà simile a questa:
ui->centralWidget->layout()->addWidget(new MyGraphicsView());
Se non si utilizza un modulo e un QMainWindow
, è possibile aggiungerlo a una QWidget
se si imposta un layout per questo e quindi aggiungere il tuo QGraphicsView
a tale layout in modo simile. Se non vuoi un margine attorno al tuo QGraphicsView
, basta chiamare show su di esso e non metterlo in un layout diverso.
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
E questo è tutto. Ora sei pericoloso con QGraphicsView
e la loro interazione con il mouse.
Leggere e studiare in merito a Qt Graphics View Framework e la relativa examples per essere efficace quando si utilizzano QGraphicsView
e QGraphicsScene
. Sono strumenti molto potenti per la grafica 2D e possono avere un po 'di curva di apprendimento, ma ne valgono la pena.
phyatt, grazie mille "Si noti l'uso di mapToScene() per posizionare correttamente la posizione() della mappa eventi sul punto in cui si fa clic sul mouse sulla scena." – mathieug