ОБНОВЛЕНИЕ: есть новый класс с именем QGraphicsSceneMouseEvent
, который делает это немного проще.
Я только что закончил пример, используя его здесь:
https://stackoverflow.com/a/26903599/999943
Он отличается от ответа ниже тем, что подклассы QGraphicsScene
, а не QGraphicsView
, и он использует mouseEvent->scenePos()
, поэтому нет необходимости вручную отображать координаты.
Вы на правильном пути, но у вас еще есть немного впереди.
Вам необходимо создать подкласс QGraphicsView
, чтобы иметь возможность что-то делать с помощью нажатий мыши или с помощью отпускания мыши, используя 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
изначально не имеет точек без измерений. Возможно, вы захотите использовать элемент QGraphicsEllipse
или просто scene->addEllipseItem()
с очень маленьким радиусом.
#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));
}
Обратите внимание на использование mapToScene()
для правильного указания pos()
карты событий там, где на сцене щелкают мышью.
Вам нужно добавить экземпляр своего подкласса QGraphicsView
к макету centralWidget вашего пользовательского интерфейса, если вы собираетесь использовать форму.
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
или если ваш пользовательский интерфейс уже имеет макет, он будет выглядеть следующим образом:
ui->centralWidget->layout()->addWidget( new MyGraphicsView() );
Если вы не используете QMainWindow
и форму, вы можете добавить ее к QWidget
, если вы установите для нее макет, а затем добавьте QGraphicsView
к этому макету аналогичным образом. Если вы не хотите использовать поле вокруг вашего QGraphicsView
, просто вызовите шоу и не помещайте его в другой макет.
#include <QtGui/QApplication>
#include "myqgraphicsview.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQGraphicsView view;
view.show();
return a.exec();
}
И это все. Теперь вы опасны с QGraphicsView
и их взаимодействием с мышью.
Обязательно ознакомьтесь с Graphics View Framework Qt's и изучите примеров , которые будут эффективны при использовании QGraphicsView
и QGraphicsScene
. Они являются очень мощными инструментами для 2D-графики и могут иметь некоторую кривизну обучения, но они того стоят.