我正在开发一个以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仅在接收到鼠标按压时触发:
如果您确实收到了此事件,您可以确定此项目也收到鼠标按下事件,并且该项目是当前鼠标抓取器。