Неправильное отображение 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 шт):
Как заметил 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);
}
}
Позволило устранить проблему.