Динамическое создание QRubberBand и помещение их в QVector
Имеется задача создавать на виджете несколько QRubberBand, которые должны динамически подстраиваться под размеры виджета на котором нанесены. Подстройка размеров работает исправно.
Проблема в том, что когда я нанёс QRubberBand в нужном количестве на виджет, они объединяются в один общий QRubberBand. Подозреваю, что это происходит из-за того, что в QVector хранится один и тот же объект в разных индексах. Затрудняюсь ответить, как возможно создавать динамически QRubberBand во время выполнения программы, чтобы иметь доступ к размерам всех выделений, а не только последнего.
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QImage>
#include <QPainter>
#include <QRubberBand>
#include <QMouseEvent>
#include <QRect>
#include <QVector>
#include <QDebug>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *e);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void changeEvent(QEvent *event);
private:
QImage bg;
QBrush br;
//QRubberBand *rubberBand;
QVector <QRubberBand*> rubberVector;
QVector <QPoint> pointVector;
QPoint origin;
int icountRubber = 0;
int icountRect = 0;
double x1, x2, x3, x4, y1, y2, y3, y4 = 0;
double xc1, xc2, xc3, xc4, yc1, yc2, yc3, yc4 = 0;
double tempx, tempy = 0;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
bg.load(":/pic.jpg");
x2 = width();
y2 = height();
xc2 = width();
yc2 = height();
}
void Widget::paintEvent(QPaintEvent* e)
{
if(bg.isNull())
{
QWidget::paintEvent(e);
return;
}
QPainter p(this);
qreal xs = qreal(width()) / qreal(bg.width());
qreal ys = qreal(height()) / qreal(bg.height());
if( xs != 1 || ys != 1 )
{
x4 = width();
y4 = height();
xc4 = width();
yc4 = height();
QImage img;
int cx = qRound(e->rect().x() / xs);
int cy = qRound(e->rect().y() / ys);
int cw = qRound(e->rect().width() / xs);
int ch = qRound(e->rect().height() / ys);
cw = qMin(cw, bg.width() - cx);
ch = qMin(ch, bg.height() - cy);
img = bg.copy(cx, cy, cw, ch);
cw = qRound(cw * xs);
ch = qRound(ch * ys);
img = img.scaled(cw, ch, Qt::IgnoreAspectRatio,
/*Qt::SmoothTransformation :*/ Qt::FastTransformation);
p.drawImage(e->rect().topLeft(), img);
} else
{
p.drawImage(
e->rect().topLeft(),
bg,
QRect(e->rect().x(), e->rect().y(),
qMin(e->rect().width(), bg.width()),
qMin(e->rect().height(), bg.height())));
}
x3 = (x1 * x4) / x2;
y3 = (y1 * y4) / y2;
xc3 = (xc1 * xc4) / xc2;
yc3 = (yc1 * yc4) / yc2;
}
void Widget::resizeEvent(QResizeEvent *e) {
if(bg.isNull() || rubberVector.isEmpty())
{
QWidget::resizeEvent(e);
return;
}
for(int i = 0; i < icountRubber; i++) {
rubberVector.at(i)->setGeometry(xc3, yc3, x3, y3);
}
}
void Widget::changeEvent(QEvent *e) {
if(e->type()==QEvent::WindowStateChange && !(windowState()&Qt::WindowFullScreen))
{
for(int i = 0; i < icountRubber; i++) {
rubberVector.at(i)->setGeometry(xc3, yc3, x3, y3);
}
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
origin = event->pos();
++icountRubber;
++icountRect;
pointVector.append(origin);
QRubberBand *rubberBand = new QRubberBand(QRubberBand::Rectangle,this);
rubberVector.append(rubberBand);
rubberVector.at(icountRubber - 1)->setGeometry(QRect(pointVector.at(icountRect - 1), QSize()));
rubberVector.at(icountRubber - 1)->show();
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
//rubberVector.at(icountRubber - 1)->hide();
x1 = rubberVector.at(icountRubber - 1)->width();
y1 = rubberVector.at(icountRubber - 1)->height();
yc1 = rubberVector.at(icountRubber - 1)->y();
xc1 = rubberVector.at(icountRubber - 1)->x();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
rubberVector.at(icountRubber - 1)->setGeometry(QRect(pointVector.at(icountRect - 1), event->pos()).normalized());
}
Widget::~Widget() {}