我正在使用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);
}
我还用各自的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配置为'grabber'的情况下是否可以触发mouseMoveEvent处理程序。如果在鼠标第一次移到该项目上时自动进行配置为采集器,这也是可以接受的。
这是一个thread,其中一个非常相似的问题似乎与该项目的引用有关,但是由于我将该项目添加到场景中是这样的:
thepixMapItem = new MyGraphicsPixmapItem();
scene->addItem(thepixMapItem);
我想这没有关系。
最佳答案
解决方案是重新实现或过滤项目的hoverMoveEvent,因为mouseMoveEvent仅在收到鼠标按键时触发:
如果您确实收到此事件,则可以确定该项目也
收到鼠标按下事件,并且该项目是当前鼠标
抢夺者。