Отключить маску QWidget во время рисования или позволить событиям мыши проходить без маски - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть виджет, который используется для покрытия других виджетов. Его цель - блокировать события мыши на всех виджетах окна, кроме подсчитанных (виджеты непокрытые ). Покрывающий виджет рисует полупрозрачное изображение повсюду, но поверх непокрытых виджетов.

Мне удалось это сделать, используя QWidget::setMask и композицию из QRegion s, сделанную из выступов виджета (например, ALL.rect - uncovered_widget_1.rect - unconvered_widget_2.rect - ...) .

// mask_path is a member of type QPainterPath
// cover_widget is a member of type QWidget*
if (cover_widget->mask().isEmpty()) { // first time
  cover_widget->setMask(cover_widget->parentWidget()->rect());
  mask_path = {};
}

QPainterPath path;
path.addRect(uncovered_widget_rect);
mask_path.addPath(path);
cover_widget->setMask(cover_widget->mask().subtracted(path.toFillPolygon().toPolygon()));

enter image description here

Теперь технические характеристики немного изменились, и теперь отверстия должны иметь закругленные углы. С первой попытки я изменил addRect на addRoundedRect, но маски были двоичными, а углы не всегда рендерится округлено без сглаживания:

enter image description here

Я могу получить желаемый визуальный результат, отключив маску и используя обтравочный контур в обработчике событий рисования, но тогда события мыши не проходят через виджет.

QPainterPath path;
path.addRect(geometry());
painter.setClipPath(path.subtracted(mask_path));

enter image description here

Я безуспешно пытался игнорировать события мыши в виджете покрытия. AFAIK, когда событие игнорируется, оно переходит к родителю, но не возвращается к другому ребенку (поправьте меня, если я ошибаюсь, пожалуйста).

Я видел RenderFlag::IgnoreMask, но единственное место, где его можно использовать, - это пользовательский вызов QWidget::render, а не во время стандартного рисования.

Есть ли какой-нибудь способ, которым я могу получить такой эффект: сглаживание многоугольников + отпускание мыши события на go через только в определенных областях?

...