Ответ 1
UPDATE: существует новый класс под названием QGraphicsSceneMouseEvent
, который делает это немного проще.
Я только что закончил пример, используя его здесь:
Он отличается от ответа ниже тем, что он подклассы 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
в макет центрального экрана вашего ui, если вы собираетесь использовать форму.
QGridLayout * gridLayout = new QGridLayout(ui->centralWidget);
gridLayout->addWidget( new MyQGraphicsView() );
или если ваш ui имеет макет, он будет выглядеть следующим образом:
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
и их взаимодействием с мышью.
Обязательно прочитайте и изучите Qt Graphics View Framework и соответствующий examples, чтобы быть эффективными при использовании QGraphicsView
и QGraphicsScene
. Они очень мощные инструменты для 2D-графики и могут иметь немного кривой обучения, но они того стоят.