同时触发几个QGraphicsItem的mouseMoveEvent

时间:2011-11-17 15:22:47

标签: qt mouseevent qgraphicsitem

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

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

非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

据我所知,没有默认方法可以做你想做的事。您可以做的事情如下:

  • 子类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);  
}

答案 1 :(得分:1)

我正在阅读您的问题的某些内容,但听起来您可能会通过在QGraphicsItem::itemChange课程上实施QGraphicsItem来获得更好的服务。无论何时通过鼠标,键盘,程序等改变位置,都会调用此方法。如果您愿意,甚至可以取消更改。