QGraphicsView如何知道QGraphicsItem执行鼠标事件
时间: 2023-10-29 17:40:54 浏览: 187
QGraphicsView通过将鼠标事件传递给场景中的QGraphicsItem来知道哪个QGraphicsItem执行了鼠标事件。具体来说,当鼠标事件发生时,QGraphicsView会将事件发送给场景中的QGraphicsItem。如果QGraphicsItem在其boundingRect()内接受了鼠标事件,则该事件将被处理,并且QGraphicsItem的相应函数(例如mousePressEvent())将被调用。如果QGraphicsItem没有接受鼠标事件,则QGraphicsView将检查下一个图形项,直到找到一个接受了事件的图形项为止。如果没有图形项接受鼠标事件,则该事件将被忽略。
相关问题
QGraphicsItem QGraphicsView共同执行鼠标事件 C++
在 Qt 中,QGraphicsItem 和 QGraphicsView 都有处理鼠标事件的成员函数。为了让它们共同处理鼠标事件,你可以使用 QGraphicsView 的 viewport() 函数来获取它的视图窗口,然后将视图窗口的鼠标事件转发给场景中的 QGraphicsItem。
以下是一个示例代码:
```cpp
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
QGraphicsView::mousePressEvent(event);
// 将鼠标事件转发给场景中的所有项
QPointF scenePos = mapToScene(event->pos());
QList<QGraphicsItem*> items = scene()->items(scenePos);
for (QGraphicsItem* item : items) {
QGraphicsSceneMouseEvent sceneEvent(QEvent::GraphicsSceneMousePress);
sceneEvent.setScenePos(scenePos);
sceneEvent.setScreenPos(event->globalPos());
sceneEvent.setButton(event->button());
sceneEvent.setButtons(event->buttons());
sceneEvent.setModifiers(event->modifiers());
item->sceneEvent(&sceneEvent);
}
}
```
在这个示例代码中,我们重载了 QGraphicsView 的 mousePressEvent() 函数,并将它的事件转发给场景中的所有项。我们首先调用 QGraphicsView 的 mousePressEvent() 函数,以便处理视图中的其他逻辑。然后,我们使用 mapToScene() 函数将视图坐标转换为场景坐标,并获取该位置上的所有项。接着,我们创建了一个 QGraphicsSceneMouseEvent 对象,设置了它的参数,并将它发送给每个场景项的 sceneEvent() 函数。
请注意,这只是一个示例代码,你可能需要根据你的应用程序的需求进行调整。
QGraphicsItem执行鼠标事件如何发送给QGraphicsView
在Qt中,QGraphicsScene是QGraphicsItem的容器,而QGraphicsView是QGraphicsScene的视图。当鼠标事件发生在QGraphicsItem上时,可以通过重写QGraphicsItem的鼠标事件函数来处理事件,并且可以使用QGraphicsScene的方法将事件发送给QGraphicsView。
具体来说,可以使用QGraphicsScene的方法sceneEvent和sendEvent将QGraphicsItem的鼠标事件发送给QGraphicsView。在QGraphicsItem的鼠标事件函数中,可以通过以下方法将事件发送给QGraphicsView:
```cpp
void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsScene *scene = this->scene();
if (scene) {
scene->sendEvent(this, event);
}
}
```
在QGraphicsView中,可以重写鼠标事件函数来处理从QGraphicsItem发送的事件。例如:
```cpp
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
// 处理鼠标事件
}
```
这样,当鼠标事件发生在QGraphicsItem上时,QGraphicsItem会将事件发送给QGraphicsView,然后QGraphicsView会调用自己的鼠标事件函数来处理事件。
阅读全文