QGraphicsItem执行鼠标事件完如何发送给QGraphicsView C++
时间: 2023-10-29 19:06:25 浏览: 130
现QGraphicsItem的鼠标事
在Qt中,QGraphicsItem和QGraphicsView之间的事件通常是通过QGraphicsScene来传递的。当QGraphicsItem接收到鼠标事件时,可以使用场景中的QGraphicsScene::mousePressEvent()、QGraphicsScene::mouseMoveEvent()和QGraphicsScene::mouseReleaseEvent()等函数将事件发送给场景。然后场景会将事件转发给QGraphicsView。在QGraphicsView中,您可以重写QGraphicsView::mousePressEvent()、QGraphicsView::mouseMoveEvent()和QGraphicsView::mouseReleaseEvent()等函数来处理这些事件。
以下是一个简单的示例代码:
```cpp
// MyItem.h
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
};
// MyItem.cpp
#include "MyItem.h"
#include <QPainter>
MyItem::MyItem()
{
setFlag(ItemIsMovable);
}
void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mousePressEvent(event);
scene()->mousePressEvent(event);
}
// MyView.h
#include <QGraphicsView>
class MyView : public QGraphicsView
{
public:
MyView(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
};
// MyView.cpp
#include "MyView.h"
#include <QGraphicsScene>
MyView::MyView(QWidget *parent)
: QGraphicsView(parent)
{
QGraphicsScene *scene = new QGraphicsScene(this);
MyItem *item = new MyItem;
scene->addItem(item);
setScene(scene);
}
void MyView::mousePressEvent(QMouseEvent *event)
{
QGraphicsView::mousePressEvent(event);
QGraphicsSceneMouseEvent sceneEvent(QEvent::GraphicsSceneMousePress);
sceneEvent.setScenePos(mapToScene(event->pos()));
sceneEvent.setScreenPos(event->globalPos());
sceneEvent.setButton(event->button());
sceneEvent.setButtons(event->buttons());
sceneEvent.setModifiers(event->modifiers());
scene()->mousePressEvent(&sceneEvent);
}
```
在上面的示例中,MyItem是一个自定义的QGraphicsItem,它重写了mousePressEvent()函数。在这个函数中,它首先调用QGraphicsItem::mousePressEvent()来处理鼠标事件,然后使用scene()函数将事件发送给场景。
MyView是一个自定义的QGraphicsView,它重写了mousePressEvent()函数。在这个函数中,它首先调用QGraphicsView::mousePressEvent()来处理鼠标事件,然后创建一个QGraphicsSceneMouseEvent对象,并将其初始化为鼠标事件的属性。最后,它使用scene()函数将事件发送给场景。
阅读全文