QGraphicsItem执行鼠标事件让QGraphicsView继续执行鼠标事件 C++
时间: 2023-09-11 15:08:11 浏览: 119
在Qt中,当鼠标点击一个QGraphicsItem时,该项会处理该事件并将其标记为已处理。如果您希望QGraphicsView继续处理该事件,则需要在QGraphicsItem中重写mousePressEvent()函数并在其中调用父类的函数以将事件传递给QGraphicsView。
以下是一个示例:
```cpp
class MyGraphicsItem : public QGraphicsItem
{
public:
MyGraphicsItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
// call the parent class' mousePressEvent to pass the event to QGraphicsView
QGraphicsItem::mousePressEvent(event);
// additional code for handling the event in the QGraphicsItem
// ...
}
};
```
在该示例中,我们首先调用了父类的mousePressEvent()函数以将事件传递给QGraphicsView,然后可以在函数中添加其他代码以处理事件。
相关问题
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的事件队列中,以确保事件能够被正确处理。
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,并设置对应的属性。