3

我有一个应用程序,其中包含许多不同的项目QGraphisScene。这些项目可以是矩形、椭圆、像素图或任何继承自QGraphicsItem. 用户可以在这些项目周围移动。(每个QGraphicsItem::ItemIsMovable标志都设置)。

应用程序需要获取事件(回调、信号或其他)来获取新位置。

如何一次性重载itemChanged()所有这些可能项目的方法?我想避免对我的每一个可能的项目进行子类化(即为任何未来项目做一个派生类QGraphicsEllipseItem,另一个为和一个子类......)?QGraphicsPixmapItem

我希望能够告诉:每次 a QGraphicsItem(或从它派生的任何东西)发生变化时,调用我的函数:

 my_item_changed(QGraphicItem* the_change_item,...).

然后能够添加不同的项目类型,而不必再担心......

有什么提示吗?

4

1 回答 1

1

您可以在 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 将阻止事件传递。

于 2013-11-08T14:01:16.547 回答