itemChanged() 在 QGraphicsItem 中用于许多不同的项目

itemChanged() in QGraphicsItem for a many different items

本文关键字:许多不 项目 用于 QGraphicsItem itemChanged      更新时间:2023-10-16

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

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

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

我希望能够告诉: 每次QGraphicsItem(或从中派生的任何内容)更改时,调用我的函数:

 my_item_changed(QGraphicItem* the_change_item,...).

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

有什么提示吗?

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

相关文章: