2

当我选择几个 QGraphicsItem(使用 Ctrl 键)时,我可以将它们一起移动,但 mouseMoveEvent 仅针对实际接收事件的项目触发。有没有办法让每个选定的项目都收到事件?我在 Qt 的文档中找不到它。

我可以将选定的项目组合在一起并在 QGraphicsView 的 mouseMoveEvent 中处理它吗?

非常感谢您的帮助:)

4

2 回答 2

3

不,据我所知,没有默认方法可以做你想做的事。您可以执行以下操作:

  • 子类QGraphicsScene化并实现mouseMoveEvent
  • itemAt在鼠标移动事件中使用函数检查事件位置是否有项目
  • 如果有一个项目并且它被选中(isSelected),则获取场景的所有选定项目。
  • 对于所有选定的项目,调用您将调用的相同函数。

示例代码如下:

void mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent) 
{
    QPointF mousePosition = mouseEvent->scenePos();
    QGraphicsItem* pItem = itemAt(mousePosition.x(), mousePosition.y());
    if (pItem == NULL)
    {
        QGraphicsScene::mouseMoveEvent(mouseEvent);
        return;
    }

    if (pItem->isSelected() == false)  
    {
        QGraphicsScene::mouseMoveEvent(mouseEvent);
        return;
    }

    // Get all selected items
    QList<QGraphicsItem *> items = selectedItems();

    for (unsinged i=0; i<items.count(); i++)
        // Do what you want to do when a mouse move over a selected item.
        items[i]->doSomething(); 

    QGraphicsScene::mouseMoveEvent(mouseEvent);  
}
于 2011-11-17T16:55:00.093 回答
1

我正在阅读您的问题的字里行间,但听起来通过QGraphicsItem::itemChange在您的QGraphicsItem课程上实施可能会更好地为您服务。每当位置发生变化时都会调用它——无论是通过鼠标、键盘、编程等等。如果你愿意,你甚至可以取消更改。

于 2011-11-17T16:15:36.097 回答