您可以在 QGraphicsItems 上安装事件过滤器。特别是,您将要使用此功能:-
void QGraphicsItem::installSceneEventFilter(QGraphicsItem * filterItem);
正如 Qt 文档所述,以下是其用法示例:-
QGraphicsScene scene;
QGraphicsEllipseItem *ellipse = scene.addEllipse(QRectF(-10, -10, 20, 20));
QGraphicsLineItem *line = scene.addLine(QLineF(-10, -10, 20, 20));
line->installSceneEventFilter(ellipse);
// line's events are filtered by ellipse's sceneEventFilter() function.
ellipse->installSceneEventFilter(line);
// ellipse's events are filtered by line's sceneEventFilter() function.
在此基础上,创建一个类,派生自QGraphicsItem,它可以首先接收事件。对于添加到场景中的每个项目,调用 installSceneEventFilter:-
mySceneEventItem.installSceneEventFilter(pGraphicsItem);
接下来,您的 eventFilter 对象将覆盖该函数:-
bool QGraphicsItem::sceneEventFilter(QGraphicsItem * watched, QEvent * event)
{
if(event->type() == QEvent::GraphicsSceneMove)
{
emit my_item_changed(watched); // signal that the item was moved
}
return false; // pass the event to the original target item
}
这使您可以检查事件并处理您感兴趣的事件。如果您从 sceneEventFilter 返回 false,则在处理完事件后,该事件将传递给原始对象;返回 true 将阻止事件传递。