C++/Qt.Как работать с событиями?

Начал изучать qt. Слепил по кускам из инета такой код. mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPainter>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
protected:
    void paintEvent(QPaintEvent*);
    void mousePressEvent(QMouseEvent*);
};
#endif // MAINWINDOW_H

mainwindow.cpp

#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*)
{
    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);
    QPoint globalCursorPos = QCursor::pos(); //читаем глобальные координаты положения курсора и переводим в локальные
    QPoint localCursorPos;
    localCursorPos = QWidget::mapFromGlobal(globalCursorPos); 
    qreal x = localCursorPos.rx();
    qreal y = localCursorPos.ry();
    if ((x>290) && (x<340) && (y>480) && (y<530)) //если мышь навелась на заданную область, что затираем старый эллипс и рисуем новый
    {
        painter.eraseRect(290,480,60,60);
        painter.drawEllipse(350,420,40,40);
    }
    update();
}
void MainWindow::mousePressEvent(QMouseEvent*)
{
     qDebug() << "Mouse pressed";

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

При наведении мыши на область эллипс переходит из одной области в другую на главном окне.

Собственно, вопрос в заголовке. Я не понимаю как работать с событиями.

Почему для того, что бы нарисовать эллипс мы записываем QPaintEvent* как параметр функции paintEvent? Чем по сути является QPaintEvent*? Это объект типа QPaintEvent переданный по ссылке? Тогда где название объекта?


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

Автор решения: Alexander Chernin

Почему для того, что бы нарисовать эллипс мы записываем QPaintEvent* как параметр функции paintEvent?

Этот объект создается перед отрисовкой, данного виджета

Чем по сути является QPaintEvent*?

Указатель на объект события отрисовки, который (объект) хранит в себе всю информацию, необходимую для отрисовки всего, что вы видите в вашем приложении (размеры и другие параметры).

Это объект типа QPaintEvent переданный по ссылке? Тогда где название объекта?

Это указатель на объект типа QPaintEvent. Если вы его не используете, то имя переменной - фактического параметра метода (типа указатель) можно и не указывать.

→ Ссылка