将鼠标事件从 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(场景中的QGraphicsItem
s)。所以场景接收鼠标事件然后将事件传递给场景中的相应项目。
所以如果 item 不接受鼠标事件,这并不意味着场景会再次处理鼠标事件。
看起来你在对场景进行子类化时搞砸了一些事情。
你的问题是错误的。
【讨论】:
谢谢@marek-r,你完全正确!!我在场景实现中发现了这个:if(itemAt(mouseEvent->scenePos()) == NULL)...
.以上是关于将鼠标事件从 QGraphicsItem 传递给 QGraphicsScene的主要内容,如果未能解决你的问题,请参考以下文章
如何仅执行 qgraphicsitem 的 mouseevent ? (忽略 qgraphicsview 的其余 mouseevent)