【问题标题】:Pass mouse events from QGraphicsItem to QGraphicsScene将鼠标事件从 QGraphicsItem 传递给 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() 并以某种方式将事件传递给场景。

【问题讨论】:

    标签: qt qgraphicsitem qgraphicsscene


    【解决方案1】:

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

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

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

    你的问题是错误的。

    【讨论】:

    • 谢谢@marek-r,你完全正确!!我在场景实现中发现了这个:if(itemAt(mouseEvent->scenePos()) == NULL){...}.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多