将鼠标事件从 QGraphicsItem 传递给 QGraphicsScene

Posted

技术标签:

【中文标题】将鼠标事件从 QGraphicsItem 传递给 QGraphicsScene【英文标题】:Pass mouse events from QGraphicsItem to QGraphicsScene 【发布时间】:2014-03-04 22:42:44 【问题描述】:

我有一个从QGraphicsScene 派生的场景对象和一个从QGraphicsItem 派生的自定义项目。 我希望这个项目对于鼠标事件是“透明的”,所以点击项目区域会调用 QGraphicsScene::mousePressEvent();

来自文档:

"...禁用项目的鼠标事件(即,使其对 鼠标事件),调用 setAcceptedMouseButtons(0)。"

但是,如果我单击项目区域,场景仍然不会收到 mouce 事件。

MyItem::MyItem(QGraphicsItem * parent) :
    QGraphicsItem(parent)

    setAcceptedMouseButtons(Qt::NoButton);


QRectF MyItem::boundingRect() const

    return QRectF(0,0,100,100);


void MyItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)

    painter->fillRect(boundingRect(),QColor(0,0,160,10));

那么我怎样才能忽略该项的鼠标事件呢?

将来我可能需要使用该项目处理鼠标事件,因此可能正确的决定是实现 QGraphicsItem::mousePressEvent() 并以某种方式将事件传递给场景。

【问题讨论】:

【参考方案1】:

你把一切都搞砸了。 QGraphicsScene 始终处理所有鼠标事件!是responsible for passing those events to its children(场景中的QGraphicsItems)。所以场景接收鼠标事件然后将事件传递给场景中的相应项目。

所以如果 item 不接受鼠标事件,这并不意味着场景会再次处理鼠标事件。

看起来你在对场景进行子类化时搞砸了一些事情。

你的问题是错误的。

【讨论】:

谢谢@marek-r,你完全正确!!我在场景实现中发现了这个:if(itemAt(mouseEvent->scenePos()) == NULL)....

以上是关于将鼠标事件从 QGraphicsItem 传递给 QGraphicsScene的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem 鼠标中按事件

创建自定义 QGraphicsItem 时拦截鼠标事件

OS X:如何将鼠标拖动事件通过视图传递给超级视图

Qt 视图框架QGraphicsItem

如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)

PyQt4:将QGraphicsItem调整为固定的QRectF