QPainter рисует только последний элемент вектора указателей

Создал вектор, состоящий из указателей на объекты класса Rect, содержащий метод рисования прямоугольника. На каждый второй клик создаётся объект, ссылка на него добавляется в вектор, после чего должны рисоваться все "объекты" вектора. Однако рисуется только последний элемент вектора. Как пофиксить? P. S. мне принципиально важно, чтобы вектор состоял из указателей (для другого проекта).

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QPainter>
#include <rect.h>

#include<iostream>
#include<vector>
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
private:
    Ui::MainWindow *ui;
    vector<Rect*> rects;
    bool first_click = true; // индикатор первого клика
    int x1, y1, x2, y2;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (first_click) {
        x1 = event->x();
        y1 = event->y();
        first_click = false;
    }
    else {
        x2 = event->x();
        y2 = event->y();
        Rect rect(x1, y1, x2, y2);
        rects.push_back(&rect);
        repaint();
        first_click = true;
    }
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter cat(this);
    cat.setBrush(Qt::red);
    if (!rects.empty()) {
        for (auto& i: rects) {
            i->draw(&cat);
        }
    }
}

rect.h

#ifndef RECT_H
#define RECT_H

#include <QPainter>

class Rect
{
public:
    Rect(int x1, int y1, int x2, int y2);
    void draw(QPainter*);

private:
    int x1, y1, widthX, widthY;
};

#endif // RECT_H

rect.cpp

#include "rect.h"


Rect::Rect(int x1, int y1, int x2, int y2)
{
    this->x1 = x1;
    this->y1 = y1;
    widthX = x2 - x1;
    widthY = y2 - y1;
}

void Rect::draw(QPainter * dog)
{
    dog->drawRect(x1, y1, widthX, widthY);
}

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

Автор решения: e.n.shirokov
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (first_click) {
        ...
    }
    else {
        ...
        Rect* rect = new Rect(x1, y1, x2, y2);
        rects.push_back(rect);
        ...
    }
}
→ Ссылка