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);
...
}
}