5

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

是否可以 ?
svg 文件是否应该专门为这种用途而设计?
是否有一些我(尚未)听说过的隐藏 Qt 选项?

4

3 回答 3

3

有一个可以应用于 SVG 元素的 CSS 属性pointer-events,尽管它的默认值是visiblePainted

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

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

于 2011-02-20T00:07:52.230 回答
2

除了找出我的问题的答案之外别无选择,这就是我所做的:

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

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

于 2011-02-20T10:58:21.513 回答
0

要完成其他答案:

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

例如

virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent *e) override
{
    if (/* any condition*/)
    {
        // Do some specific behaviour
    }
    else QGraphicsItem::mouseReleaseEvent(e);
}
于 2016-07-08T09:30:37.943 回答