如何知道当前正在移动哪个 QGraphicsItem?

Posted

技术标签:

【中文标题】如何知道当前正在移动哪个 QGraphicsItem?【英文标题】:How to know which of the QGraphicsItems is being moved at the moment? 【发布时间】:2019-06-11 13:11:29 【问题描述】:

我有QGraphicsScene,上面显示了一些自定义QGraphicsItems。这些项目在类MeasurePoint 中进行了描述,该类继承自QGraphicsItem。它们也存储在QList,所以每个项目都有它的索引。它们像这样添加到场景中:

void MeasureSpline::addNode(qreal xPos, qreal yPos, QGraphicsScene *scene)

    MeasurePoint *point = new MeasurePoint(xPos, yPos, points.size());
    points.append(point);
    point->setPoint(scene);

points 在哪里:

QList<MeasurePoint*> points;

每个MeasurePoint 的构造如下:

MeasurePoint::MeasurePoint(qreal a, qreal b, int c)

    xPos = a;
    yPos = b;
    index = c;
    movable = false;
    selected = false;

setPoint() 是:

void MeasurePoint::setPoint(QGraphicsScene *scene)

    scene->addItem(this);

我有一种设置可移动项目的方法。如果我使用这种方法,这些物品就会变成可移动的,我对结果很满意。但我目前的目标是知道目前正在移动哪些项目。可以做到吗?如何?任何帮助表示赞赏。

【问题讨论】:

offtopic:setPoint(scene); 还是应该是setScene(scene); @MarekR 就是这样,这里没有错。该函数将 MeasurePoint 添加到场景中 【参考方案1】:

首先,让 QGraphicsItem 像这样对位置变化做出反应:

item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | 
QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsScenePositionChanges);

然后您可以重新实现 Change-Event 并从那里发出信号:

QVariant Item::itemChange(GraphicsItemChange change, const QVariant &value)

if (change == ItemPositionChange  && scene() || change == ItemScenePositionHasChanged)  // either during mouseMoveEvent or when Dropped again

    emit itemMoved();  // connect to other SLOT and cast QObject::sender() or something here....

    return QGraphicsItem::itemChange(change, value);

编辑:

接收方法的未测试代码:

void MyClass::onItemMoved()


MesurePoint* item = dynamic_cast<MesurePoint*>(QObject::sender());

if (item != NULL)
 
   int index = points.IndexOf(item);
 

【讨论】:

感谢您的回答。有没有办法改变 itemChange() 函数,使其返回正在移动的项目的索引?我在 MeasurePoint 类中有索引字段,它是在创建新的 MeasurePoint 对象时分配的。我可以以某种方式访问​​该函数中的该字段吗? return-Value 不是你感兴趣的东西。它只是将事件传递给 QGraphicsItem。我不知道您所说的“项目索引”是什么意思。它是它所持有的列表中项目的索引吗?我无法想象项目知道此索引的方式,但您可以在接收函数中遍历该列表,直到找到它。【参考方案2】:

您可以捕捉(鼠标按下和移动)事件sent to QGraphicsItem from QGraphicsScene,然后 - 例如 - 发出一个您可以连接的信号。

【讨论】:

以上是关于如何知道当前正在移动哪个 QGraphicsItem?的主要内容,如果未能解决你的问题,请参考以下文章

oracle.exe接近100%,请问如何知道当前正在执行哪个sql语句?

如何知道哪个uiview用户正在使用

如何知道 R 中哪个包保存当前函数?

C++ 中的哪个 Windows API 将帮助我识别当前 ComboBox 正在使用哪个对话框类?

如何找出当前在 Xcode 中正在编译的文件 [重复]

我如何知道当前的 svn 存储库是哪个版本?