ОБНОВЛЕНИЕ: есть новый класс 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
было поле, просто вызовите для него show и не помещайте его в другой макет.
#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 и связанные с ним примеры, чтобы быть эффективными при использовании QGraphicsView
и QGraphicsScene
. Это очень мощные инструменты для 2D-графики, и они могут потребовать некоторого обучения, но они того стоят.
person
phyatt
schedule
20.10.2011