Как нарисовать точку (на mouseclick) на QGraphicsScene?
у меня есть следующий код, чтобы создать QGraphicsScene
. Я хочу щелкнуть по сцене и нарисовать точку в том месте, где я щелкнул. Как я мог это сделать? Это мой текущий код:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene;
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(QRect(20, 50, 400, 400));
scene = new QGraphicsScene(50, 50, 350, 350);
view->setScene(scene);
}
1 ответов
UPDATE: существует новый класс под названием 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
и их взаимодействие с мышью.
обязательно прочитайте и изучите Qt Рамки Просмотра Графики и связанные с примеры чтобы быть эффективным при использовании QGraphicsView
и QGraphicsScene
. Они очень мощные инструменты для 2D-графики и может иметь немного кривой обучения, но они того стоят.