我有一个非常简单的自己的QGraphicsScene类:
class SceneComponent : public QGraphicsScene
{
Q_OBJECT
public:
explicit SceneComponent(QObject* parent = 0);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
};
mousePressEvent(QGraphicsSceneMouseEvent*)
定义为:
void SceneComponent::mousePressEvent(QGraphicsSceneMouseEvent* event) {
Q_UNUSED(event);
std::cout<<"[Processing] MouseEvent"<<std::endl;
}
要显示此QGraphicsView,这很简单:
QGraphicsView view(sceneComp);
view.show();
现在,当我点击显示的窗口(对于QGraphicsView)时,我得到以下输出:
[Processing] MouseEvent
[Processing] MouseEvent
但是,当我使用:
发送合成事件时QMouseEvent* mevent = new QMouseEvent(
QMouseEvent::MouseButtonPress, QPoint(50, 50),
Qt::LeftButton, Qt::NoButton, Qt::NoModifier
);
QApplication::sendEvent(&view, mevent);
我绝对没有输出。这是为什么?
在相关说明中,在 QGraphicsScene 上安装eventFilter
不会产生任何结果。这可能(在我看来)是因为 QGraphicsScene 需要 QGraphicsSceneMouseEvent 而不是 QMouseEvent 。这支持了两个问题:
答案 0 :(得分:2)
来自QGraphicsSceneEvent
的文档:
当QGraphicsView收到Qt时 鼠标,键盘和拖放 事件(QMouseEvent,QKeyEvent, QDragEvent等),它翻译它们 进入QGraphicsSceneEvent的实例 子类并将它们转发给 它显示QGraphicsScene。现场 然后将事件转发给 相关项目。
例如,当一个QGraphicsView 接收类型的QMouseEvent MousePress作为对用户的响应 点击,视图发送一个 QGraphicsSceneMouseEvent的类型 GraphicsSceneMousePress到 基础QGraphicsScene通过它 mousePressEvent()函数。该 默认 QGraphicsScene :: mousePressEvent() 实现确定哪个项目 被点击并将事件转发给 的QGraphicsItem :: mousePressEvent()。
QGraphicsView
使用视口窗口小部件显示场景内容并接收用户事件。尝试将您的活动发送到QGraphicsView::viewport()
小部件 - 它应该有效。QMouseEvent
与身体动作相关联 - 例如鼠标点击,而QGraphicsSceneMouseEvent
是抽象的...... QGraphicsScene
有QObject
个级事件,与QApplication::sendEvent()
一起发送,QGraphicsItem
个事件与QGraphicsScene::sendEvent()
一起发送。这两种工作在不同的平面上,有不同的用途。有关详细信息,请参阅文档。