qt. Отрисовка фигуры после нажатия кнопки мыши

Есть две функции. Одна рисует эллипс. Другая обрабатывает нажатие левой кнопки мыши. Как сделать так, что бы эллипс рисовался в заданных координатах после нажатия в любом месте формы на левую кнопку мыши?

//mainwindow.h
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); //настраиваем размеры и цвет эллипса и отрисовываем его
    painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
    painter.setBrush(QColor(122, 163, 39));
    painter.drawEllipse(290,480,40,40);
}
void MainWindow::mousePressEvent(QMouseEvent*event)
{
    switch (event->button()) {
            case Qt::LeftButton:
            {
                qDebug() << "Left Mouse button pressed";
                break;
            }
    }

}
MainWindow::~MainWindow()
{
    delete ui;
}



Ответы (2 шт):

Автор решения: MBo

В событийном программировании обычно это делается так - по нажатию мыши в некую структуру (или даже очередь) записывается, что нужно нарисовать, и инициируется перерисовка окна или нужной области (repaint/refresh/invalidate...). Напрямую рисование не вызывается.

В обработчике перерисовки, когда придёт его время - у вас это, видимо, paintEvent - проверяется данная структура, по информации из неё рисуется то, что нужно, и структура очищается (ставится флаг "нечего рисовать")

→ Ссылка
Автор решения: needKVAS

Сохраняйте положение эллипса. При изменении его положения вызывайте отложенную перерисовку виджета (update()).

В mainwindow.h:

private:
    QPoint ellipse_;

В mainwindow.cpp:


void MainWindow::paintEvent(QPaintEvent*)
{
    if (!ellipse_.isNull()) {
        QPainter painter(this); //настраиваем размеры и цвет эллипса и отрисовываем его
        painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
        painter.setBrush(QColor(122, 163, 39));
        painter.drawEllipse(ellipse_,40,40);
    }
}
void MainWindow::mousePressEvent(QMouseEvent*event)
{
    switch (event->button()) {
            case Qt::LeftButton:
            {
                qDebug() << "Left Mouse button pressed";
                ellipse_ =  event->pos();
                update();
                break;
            }
    }
}

Однако, если вы хотите рисовать примитивы, обратите своё внимание на QGraphicsView и QGraphicsScene. Обычный QWidget гораздо менее удобен для этого.

→ Ссылка