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 шт):
В событийном программировании обычно это делается так - по нажатию мыши в некую структуру (или даже очередь) записывается, что нужно нарисовать, и инициируется перерисовка окна или нужной области (repaint/refresh/invalidate...). Напрямую рисование не вызывается.
В обработчике перерисовки, когда придёт его время - у вас это, видимо, paintEvent - проверяется данная структура, по информации из неё рисуется то, что нужно, и структура очищается (ставится флаг "нечего рисовать")
Сохраняйте положение эллипса. При изменении его положения вызывайте отложенную перерисовку виджета (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
гораздо менее удобен для этого.