Динамическое создание 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() {}

1 2


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