不抓取时的QGraphicsPixmapItem mouseMoveEvent



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

以下是如何从QGraphicsPixmapItem I子类QGraphicsPix mapItem:显示像素位置和颜色

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);
}

我还用各自的mouseMoveEvent处理程序对QGraphicsView和QGraphicsScene进行了子类化,这些处理程序可以成功地将事件向下传递:

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配置为"抓取器"的情况下触发mouseMoveEvent处理程序。如果在鼠标第一次移动到项目上时自动发生抓取器配置,也是可以接受的。

这里有一个线程,其中一个非常相似的问题似乎与项目的引用有关,但由于我将项目添加到场景中,如下所示:

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

我想这没有关系。

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

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

相关内容

  • 没有找到相关文章

最新更新