Игнорировать события мыши над прозрачными частями изображения SVG в qgraphicsview? - PullRequest
4 голосов
/ 17 февраля 2011

Я работаю над графическим представлением (использующим C ++ и Qt), которое содержит довольно много SVG-изображений.Я перехватываю клики на них, но я не хотел бы получать события (или иметь возможность их игнорировать), когда мышь находится над прозрачными частями элементов SVG.

Возможно ли это?
Должны ли файлы SVGбыть специально разработан для такого использования?
Есть ли какая-то скрытая опция Qt, о которой я (пока) не слышал?

Ответы [ 3 ]

3 голосов
/ 20 февраля 2011

Существует свойство CSS, которое можно применить к элементам SVG, pointer-events, хотя по умолчанию для этого используется visiblePainted:

Данный элемент может бытьцелевой элемент для событий указателя, когда свойство visibility установлено в visible и когда указатель находится над «закрашенной» областью.Указатель находится над закрашенной областью, если он находится над внутренней частью (т. Е. Засыпкой) элемента, а свойство 'fill' имеет фактическое значение, отличное от none, или за периметром (т. Е. Штрихом) элемента иСвойству 'stroke' присвоено значение, отличное от none.

Что указывает на то, что графическое представление Qt не поддерживает его.

2 голосов
/ 20 февраля 2011

Не имея другого выбора, кроме как найти нелегкий ответ на мой вопрос, вот что я сделал:

  • искал определение mousePressEvent в QGraphicsSvgItem.cpp. Не найдено.
  • искал определение mousePressEvent в QGraphicsItem.cpp (предок QGraphicsSvgItem). Метод существует, но там не найдено соответствующих действий.
  • искал вызовы mousePressEvent в QGraphicsItem.cpp. Я обнаружил, что читаю код QGraphicsItem :: sceneEvent (), диспетчера событий мыши для графической сцены Qt. Кажется, что нет различий между различными зонами графических элементов.

Отсюда печальный ответ: Qt не допускает такого поведения.

0 голосов
/ 08 июля 2016

Для завершения других ответов:

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

Например,

virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent *e) override
{
    if (/* any condition*/)
    {
        // Do some specific behaviour
    }
    else QGraphicsItem::mouseReleaseEvent(e);
}
...