Неправильное отображение QRubberBand при полноэкранном режиме

Выполняю задачу нанесения и изменения размеров QRubberBand на поверхность виджета с изображением. Размеры текущей выделенной области (а их планируется несколько), выводятся с QVector<QRubberBand*>.

В оконном режиме всё работает так как надо, до момента включения полноэкранного режима, из-за чего текущий объект QRubberBand перескакивает в рандомное место, тоже самое происходит при возврате в оконный режим, но стоит немного изменить размеры окна, при возврате из полноэкранного режима, тогда объект возвращается на нужную позицию по значениям xc3 и yc3.

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

    rubberVector.at(icountRubber - 1)->setGeometry(xc3, yc3, x3, y3);
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    origin = event->pos();

    icountRubber++;
    icountRect++;

    pointVector.append(origin);

    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)
{
    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 шт):

Автор решения: nayaga

Как заметил Alex F, причина могла быть в необходимости отдельной обработки события включения полноэкранного режима.

А именно:

void Widget::changeEvent(QEvent *event) {
    if( event->type()==QEvent::WindowStateChange and !(windowState()&Qt::WindowFullScreen) )
    {
        rubberVector.at(icountRubber - 1)->setGeometry(xc3, yc3, x3, y3);
    }
}

Позволило устранить проблему.

→ Ссылка