不抓取时QGraphicsPixmapItem mouseMoveEvent

时间:2012-08-23 10:53:16

标签: c++ qt user-interface graphics mouseevent

我正在使用Qt 4.8作为GUI框架的C ++应用程序: 子类化的QGraphicsView呈现子类化的QGraphicsScene,其中包含一个或多个子类化的QGraphicsPixMapItem,其中我需要知道鼠标光标的相对像素位置。

关注How to show pixel position and color from a QGraphicsPixmapItem我的子类QGraphicsPixmapItem

class MyGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT
public:
    explicit MyGraphicsPixmapItem(QGraphicsItem *parent = 0);
signals:
public slots:
    void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
};

并实现构造函数和处理程序:

MyGraphicsPixmapItem::MyGraphicsPixmapItem(QGraphicsItem *parent) : QGraphicsPixmapItem(parent)
{
    qDebug() << "constructor mygraphicspixmapitem";
    setCacheMode(NoCache);
    setAcceptHoverEvents(true);
    setFlag(QGraphicsItem::ItemIsSelectable,true);
}

void MyGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
    QPointF mousePosition = event->pos(); 
    qDebug() << "mouseMoveEvent";
    qDebug() << mousePosition;
    QGraphicsPixmapItem::mouseMoveEvent(event);
}

我还将QGraphicsView和QGraphicsScene与各自的mouseMoveEvent处理程序一起子类化,这些处理程序成功地将事件进一步传递下去:

void MyGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << "QGraphicsScene: mouseMoveEvent";
    QGraphicsScene::mouseMoveEvent(event);
}

但是,尽管MyGraphicsView配置了......

setMouseTracking(true);
setInteractive(true);

... MyGraphicsPixmapItem仅在单击或将其设置为抓取器后执行mouseMoveEvent处理程序:

void MyGraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    qDebug() << QString("item clicked at: %1, %2").arg( event->pos().x()).arg( event->pos().y()  );
    event->accept();
    grabMouse();
}

我想知道我是犯了错误还是上述答案中给出的解决方案存在缺陷或不完整。此外,我想知道是否可以在没有将QGraphicsPixmapItem配置为“grabber”的情况下触发mouseMoveEvent处理程序。如果当鼠标第一次移动到项目上时,配置为抓取器也是可以接受的。

这是thread,其中一个非常类似的问题似乎与项目的引用有关,但是因为我将项目添加到场景中,如下所示:

thepixMapItem = new MyGraphicsPixmapItem();
scene->addItem(thepixMapItem);

我认为这与此无关。

1 个答案:

答案 0 :(得分:0)

解决方案是重新实施或过滤项目的hoverMoveEvent,因为mouseMoveEvent仅在接收鼠标时触发:

  

如果您确实收到此活动,则可以确定此项目   收到鼠标按下事件,并且该项目是当前鼠标   抓取器。