QGraphicsItem执行鼠标事件完如何发送给QGraphicsView C++
时间: 2023-09-10 15:07:12 浏览: 138
现QGraphicsItem的鼠标事
在Qt中,QGraphicsView是一个用于显示QGraphicsScene中图形项的部件。如果您想要将QGraphicsItem的鼠标事件传递给QGraphicsView,可以使用以下方法:
1. 在QGraphicsScene中捕获QGraphicsItem的鼠标事件。您可以通过重写QGraphicsItem的mousePressEvent(),mouseMoveEvent()和mouseReleaseEvent()函数来实现。
2. 在QGraphicsItem的鼠标事件处理函数中,使用parentItem()函数获取其父级图形项,然后使用scene()->views()函数获取与场景相关联的所有QGraphicsView。
3. 遍历所有QGraphicsView,使用mapFromScene()函数将鼠标事件的位置从场景坐标系转换为视图坐标系。
4. 使用underMouse()函数检查当前鼠标位置下是否有其他图形项。
5. 如果没有其他图形项,则使用viewport()函数获取视图的QWidget,并使用QCoreApplication::sendEvent()函数将鼠标事件发送给QWidget。
以下是示例代码:
```c++
void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
// 获取父级图形项
QGraphicsItem* parent = parentItem();
// 遍历所有相关联的QGraphicsView
QList<QGraphicsView*> views = scene()->views();
for (int i = 0; i < views.size(); ++i) {
// 将鼠标事件的位置从场景坐标系转换为视图坐标系
QPoint pos = views.at(i)->mapFromScene(event->scenePos());
// 检查当前鼠标位置下是否有其他图形项
QGraphicsItem* item = views.at(i)->itemAt(pos);
if (item == parent) {
// 如果鼠标事件发生在该图形项上,则将其发送到视图中
QMouseEvent viewEvent(QEvent::MouseButtonPress, pos, event->button(), event->buttons(), event->modifiers());
QCoreApplication::sendEvent(views.at(i)->viewport(), &viewEvent);
}
}
}
```
阅读全文