先执行QGraphicsItem鼠标事件接着执行QGraphicsView鼠标事件 C++
时间: 2023-09-16 20:06:41 浏览: 59
在Qt中,当鼠标点击一个QGraphicsItem时,会先触发该Item的鼠标事件,然后再传递给QGraphicsView进行处理。如果你想先处理Item的鼠标事件,可以在QGraphicsItem子类中重写mousePressEvent()、mouseReleaseEvent()、mouseMoveEvent()等事件。
如果你需要在Item的事件处理完成后再处理View的事件,可以使用QGraphicsView的viewportEvent()函数,该函数会在视口接收到事件后被调用。你可以在QGraphicsView子类中重写viewportEvent()函数,并在其中处理视口事件。
以下是一个示例代码:
```cpp
// MyItem.h
class MyItem : public QGraphicsItem
{
public:
MyItem();
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
};
// MyItem.cpp
MyItem::MyItem()
{
setFlag(ItemIsMovable);
}
QRectF MyItem::boundingRect() const
{
return QRectF(-50, -50, 100, 100);
}
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawRect(boundingRect());
}
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
qDebug() << "Item mousePressEvent";
QGraphicsItem::mousePressEvent(event);
}
// MyView.h
class MyView : public QGraphicsView
{
public:
MyView(QWidget *parent = nullptr);
protected:
void viewportEvent(QEvent *event) override;
};
// MyView.cpp
MyView::MyView(QWidget *parent)
: QGraphicsView(parent)
{
}
void MyView::viewportEvent(QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress) {
qDebug() << "View mousePressEvent";
}
QGraphicsView::viewportEvent(event);
}
```
在上面的示例中,我们创建了一个MyItem类,重写了mousePressEvent()函数来处理Item的鼠标事件。我们还创建了一个MyView类,重写了viewportEvent()函数来处理View的鼠标事件。当我们在场景中点击MyItem时,会先输出"Item mousePressEvent",然后再输出"View mousePressEvent"。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)