在qgraphicsview中忽略SVG图像透明部分的鼠标事件?

4

我正在使用C++和Qt开发一个图形视图,其中包含许多SVG图像。当我拦截点击事件时,我希望不在SVG项的透明部分接收事件(或者能够忽略它们)。

这可能吗?
SVG文件应该专门为这种用途设计吗?
是否有一些隐藏的Qt选项我还没有听说过?

3个回答

3
有一种CSS属性可以应用于SVG元素,pointer-events,但默认情况下为visiblePainted
给定元素可以是指针事件的目标元素,当“visibility”属性设置为可见且指针位于“绘制”区域上方时。如果指针位于元素的内部(即填充)并且“fill”属性具有除none以外的实际值,或者指针位于元素的周长(即描边)上并且“stroke”属性设置为非none值,则指针位于绘制区域上方。
这表明Qt图形视图不支持它。

2

由于没有其他选择,我只能通过自己的努力找到问题的答案,以下是我的做法:

  • 查找QGraphicsSvgItem.cpp中的mousePressEvent定义,但未找到相关内容。
  • 查找QGraphicsItem.cpp(QGraphicsSvgItem的祖先类)中的mousePressEvent定义。虽然该方法存在,但没有找到任何相关操作。
  • 查找QGraphicsItem.cpp中的mousePressEvent调用。最终发现自己正在阅读Qt图形场景的鼠标事件分发器QGraphicsItem::sceneEvent()代码。似乎没有区分不同图形项的不同区域的功能。

因此,可悲的答案是:Qt不允许这种行为。


0

补充其他答案:

重新实现事件时,如果不调用基类事件处理程序来处理默认情况,则会丢失非绘制部分的事件透明度。

例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接