Я столкнулся с проблемой стирания ранее окрашенных областей виджета Qt.
Основная идея заключается в том, что пользователь выбирает область экрана, щелкая и перетаскивая мышь, и на выбранной области рисуется прямоугольник.
Заголовок
class ClearBack : public QWidget
{
Q_OBJECT
public:
explicit ClearBack(const QPoint &startingPos);
bool eventFilter(QObject *obj, QEvent *event);
void paintEvent(QPaintEvent *);
void mouseMoveEvent(QMouseEvent *event);
signals:
void regionSelected(const QRect &);
private:
QRect currentRegion;
};
Реализация
ClearBack::ClearBack(const QPoint &startingPos)
{
setBackgroundRole(QPalette::Base);
installEventFilter(this);
currentRegion.setTopLeft(startingPos);
currentRegion.setBottomRight(startingPos);
this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
this->showMaximized();
}
void ClearBack::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::black);
painter.drawRect(currentRegion);
}
void ClearBack::mouseMoveEvent(QMouseEvent *event)
{
QPoint currentPos(event->globalX(), event->globalY());
currentRegion.setBottomRight(currentPos);
this->repaint();
}
На виджете со сплошным фоном эффект работает довольно хорошо, создавая один прямоугольник.
Однако, когда фон установлен на setAttribute(Qt::WA_TranslucentBackground);
, происходит следующее.
Прямоугольники, которые были нарисованы ранее, не "стираются"
Есть ли способ стереть нарисованные ранее прямоугольники на полупрозрачном фоне, и если да, то как?
Также для "бонусных баллов" почему этот эффект возникает на полупрозрачном фоне, а не на сплошном?