将QGraphicsItem中的鼠标事件传递给QGraphicsScene

时间:2014-03-04 22:42:45

标签: qt qgraphicsitem qgraphicsscene

我有一个源自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 个答案:

答案 0 :(得分:1)

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

因此,如果item不接受鼠标事件,则这并不意味着场景将再次处理鼠标事件。

当你做了一个场景的子类时,看起来你搞砸了什么。

底线你的问题是错误的。