QGraphicsItem执行鼠标事件完后让QGraphicsView继续执行鼠标事件 C++
时间: 2023-09-15 18:16:46 浏览: 177
在 Qt 中,可以通过在 QGraphicsItem 上实现 mousePressEvent()、mouseMoveEvent() 和 mouseReleaseEvent() 等函数来处理鼠标事件。如果在 QGraphicsItem 上处理了鼠标事件,那么 QGraphicsView 将不会再收到这些事件。但有时候我们需要在 QGraphicsItem 处理完鼠标事件后,让 QGraphicsView 继续处理这些事件,可以使用 QGraphicsItem::ignore() 函数来实现。
具体来说,当 QGraphicsItem 上的 mousePressEvent() 函数被调用时,可以在函数最后添加一行代码:
```cpp
void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
// 处理鼠标事件
// ...
// 忽略鼠标事件,让 QGraphicsView 继续处理
QGraphicsItem::mousePressEvent(event);
}
```
这样,当 QGraphicsItem 处理完鼠标事件后,会调用 QGraphicsView 的 mousePressEvent() 函数来处理这些事件。同样的,也可以在 mouseMoveEvent() 和 mouseReleaseEvent() 函数中实现类似的逻辑。
相关问题
QGraphicsItem执行鼠标事件完后让QGraphicsView执行鼠标事件 C++
在 Qt 中,QGraphicsItem 和 QGraphicsView 都有鼠标事件处理函数,分别是 QGraphicsItem::mousePressEvent()、QGraphicsView::mousePressEvent() 等。如果你想在 QGraphicsItem 处理完鼠标事件后让 QGraphicsView 继续处理,可以使用 QGraphicsView::mousePressEvent() 函数的 callSuper() 方法。具体实现方法如下:
1. 在 QGraphicsItem 的鼠标事件处理函数中调用 QGraphicsView 的鼠标事件处理函数:
```cpp
void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
// 处理自己的鼠标事件
// 调用 QGraphicsView 的鼠标事件处理函数
QGraphicsView *view = scene()->views().first();
view->mousePressEvent(event);
// 不要忘记调用父类的函数
QGraphicsItem::mousePressEvent(event);
}
```
2. 在 QGraphicsView 的鼠标事件处理函数中调用 callSuper() 方法:
```cpp
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
// 处理自己的鼠标事件
// 调用父类的鼠标事件处理函数
QGraphicsView::mousePressEvent(event);
// 调用 QGraphicsItem 的鼠标事件处理函数
QGraphicsItem *item = itemAt(event->pos());
if (item != nullptr) {
QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMousePress);
mouseEvent.setPos(item->mapFromScene(mapToScene(event->pos())));
mouseEvent.setScenePos(mapToScene(event->pos()));
mouseEvent.setScreenPos(event->globalPos());
mouseEvent.setButton(event->button());
mouseEvent.setButtons(event->buttons());
mouseEvent.setModifiers(event->modifiers());
item->mousePressEvent(&mouseEvent);
}
}
```
注意,在调用 QGraphicsView 的鼠标事件处理函数之后,要调用父类的鼠标事件处理函数。另外,在调用 QGraphicsItem 的鼠标事件处理函数时,要将事件转换为 QGraphicsSceneMouseEvent,并设置对应的属性。
QGraphicsItem执行鼠标事件后让QGraphicsView执行鼠标事件 C++
在Qt中,可以通过将QGraphicsItem的鼠标事件转发给其父QGraphicsView来实现。具体步骤如下:
1. 重写QGraphicsItem的鼠标事件函数,例如mousePressEvent()。
2. 在该函数中,调用parentItem()函数获取父QGraphicsView对象,并将事件转发给它。
3. 在QGraphicsView中重写鼠标事件函数(例如mousePressEvent()),并处理该事件。
以下是示例代码:
在QGraphicsItem中重写鼠标事件函数:
```
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsView *view = qobject_cast<QGraphicsView *>(parentItem());
if (view)
{
QMouseEvent *newEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers());
QApplication::postEvent(view, newEvent);
}
}
```
在QGraphicsView中重写鼠标事件函数:
```
void MyView::mousePressEvent(QMouseEvent *event)
{
// 处理鼠标事件
}
```
需要注意的是,在转发事件时,需要使用QApplication::postEvent()函数将事件推送到QGraphicsView的事件队列中,以确保事件能够被正确处理。
阅读全文