先执行QGraphicsItem鼠标事件再执行QGraphicsView鼠标事件 C++
时间: 2023-09-10 14:10:44 浏览: 129
现QGraphicsItem的鼠标事
在Qt中,QGraphicsScene和QGraphicsView提供了处理鼠标事件的函数。一般情况下,当鼠标事件发生时,会首先调用QGraphicsScene的鼠标事件函数,然后再调用QGraphicsView的鼠标事件函数。
如果你希望先执行QGraphicsItem的鼠标事件函数,再执行QGraphicsView的鼠标事件函数,你可以通过重写这些函数实现。例如:
```cpp
class MyGraphicsView : public QGraphicsView
{
protected:
void mousePressEvent(QMouseEvent *event) override
{
// 首先调用QGraphicsScene的鼠标事件函数
QGraphicsView::mousePressEvent(event);
// 再调用QGraphicsItem的鼠标事件函数
QGraphicsItem *item = itemAt(event->pos());
if (item) {
QMouseEvent itemEvent(event->type(), event->localPos(), event->screenPos(),
event->button(), event->buttons(), event->modifiers());
item->mousePressEvent(&itemEvent);
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
// 首先调用QGraphicsScene的鼠标事件函数
QGraphicsView::mouseMoveEvent(event);
// 再调用QGraphicsItem的鼠标事件函数
QGraphicsItem *item = itemAt(event->pos());
if (item) {
QMouseEvent itemEvent(event->type(), event->localPos(), event->screenPos(),
event->button(), event->buttons(), event->modifiers());
item->mouseMoveEvent(&itemEvent);
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
// 首先调用QGraphicsScene的鼠标事件函数
QGraphicsView::mouseReleaseEvent(event);
// 再调用QGraphicsItem的鼠标事件函数
QGraphicsItem *item = itemAt(event->pos());
if (item) {
QMouseEvent itemEvent(event->type(), event->localPos(), event->screenPos(),
event->button(), event->buttons(), event->modifiers());
item->mouseReleaseEvent(&itemEvent);
}
}
};
```
在这个例子中,我们重写了QGraphicsView的鼠标事件函数,并在函数中首先调用了QGraphicsScene的鼠标事件函数,然后再通过itemAt()函数获取鼠标下方的QGraphicsItem,并调用该item的鼠标事件函数。这样就可以实现先执行QGraphicsItem的鼠标事件函数再执行QGraphicsView的鼠标事件函数的效果。
阅读全文