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

时间:2011-02-17 08:04:08

标签: c++ svg mouseevent transparent qgraphicsview

我正在使用包含相当多svg图像的图形视图(使用C ++和Qt)。我拦截了对它们的点击,但是当鼠标悬停在svg项目的透明部分上时,我不想接收事件(或者能够忽略它们)。

有可能吗?
svg文件应该专门设计用于此类用途吗? 是否有一些隐藏的Qt选项我尚未听说过?

3 个答案:

答案 0 :(得分:3)

有一个CSS属性可以应用于SVG元素pointer-events,但默认值为visiblePainted

  

当'visibility'属性设置为visible并且指针位于“绘制”区域上时,给定元素可以是指针事件的目标元素。如果指针位于绘制区域上方,如果它位于元素的内部(即填充)上,并且“填充”属性具有除非之外的实际值,或者指针位于元素的周长(即,笔划)之上,并且'stroke'属性设置为非none值。

这表明Qt图形视图不支持它。

答案 1 :(得分:2)

别无选择只能找到问题的答案,这就是我所做的:

  • 在QGraphicsSvgItem.cpp中查找mousePressEvent定义。找不到。
  • 在QGraphicsItem.cpp(QGraphicsSvgItem的祖先)中查找mousePressEvent定义。该方法存在,但在那里找不到相关的行动。
  • 在QGraphicsItem.cpp中查找mousePressEvent调用。发现自己正在阅读QGraphicsItem :: sceneEvent()的代码,为Qt图形场景调度鼠标事件。似乎没有任何区别的图形项目的不同区域。

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

答案 2 :(得分:0)

完成其他答案:

重新实现事件时,为默认情况调用基类事件非常重要,否则,非绘制部件的事件透明度将丢失。

E.g。

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