QGraphicsScene没有响应合成事件

时间:2011-02-22 15:32:41

标签: c++ events qt

我有一个非常简单的自己的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 。这支持了两个问题:

  1. 为什么QGraphicsScene不接受标准QEvent而只接受QGraphicsSceneEvent?
  2. 为什么任何QGraphicsSceneEvent派生类都不可实例化?
  3. 为什么我可以使用sceneEvent方法将事件发送到QGraphicsScene,但我需要指定一个特定的QGraphicsItem来将事件发送给?

1 个答案:

答案 0 :(得分:2)

来自QGraphicsSceneEvent的文档:

  

当QGraphicsView收到Qt时   鼠标,键盘和拖放   事件(QMouseEvent,QKeyEvent,   QDragEvent等),它翻译它们   进入QGraphicsSceneEvent的实例   子类并将它们转发给   它显示QGraphicsScene。现场   然后将事件转发给   相关项目。

     

例如,当一个QGraphicsView   接收类型的QMouseEvent   MousePress作为对用户的响应   点击,视图发送一个   QGraphicsSceneMouseEvent的类型   GraphicsSceneMousePress到   基础QGraphicsScene通过它   mousePressEvent()函数。该   默认   QGraphicsScene :: mousePressEvent()   实现确定哪个项目   被点击并将事件转发给   的QGraphicsItem :: mousePressEvent()。

  1. QGraphicsView使用视口窗口小部件显示场景内容并接收用户事件。尝试将您的活动发送到QGraphicsView::viewport()小部件 - 它应该有效。
  2. 按设计 - 参见引文,这些事件可能并非意外手动发送。 QMouseEvent与身体动作相关联 - 例如鼠标点击,而QGraphicsSceneMouseEvent是抽象的......
  3. 问题不明确,但该引用也可能有所帮助。你在谈论哪个事件?您还应该记住,QGraphicsSceneQObject个级事件,与QApplication::sendEvent()一起发送,QGraphicsItem个事件与QGraphicsScene::sendEvent()一起发送。这两种工作在不同的平面上,有不同的用途。有关详细信息,请参阅文档。