Как нарисовать точку (при щелчке мыши) на 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);
}

person Community    schedule 20.10.2011    source источник


Ответы (1)


ОБНОВЛЕНИЕ: есть новый класс 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
comment
phyatt, большое спасибо за Обратите внимание на использование mapToScene(), чтобы правильно сопоставить pos() события с местом щелчка мыши на сцене. - person mathieug; 19.05.2012