我基本上有3层(Window > Scene > View
)每个人都需要处理一个mouseMove
事件不妨碍其他人。不过,似乎只有最小的孩子才能参加该活动。我希望我可以处理该事件然后致电event->ignore()
将事件传递回堆栈,但它似乎不起作用。
如果您需要一些相关代码:
void EditorWindow::createScene() {
m_scene = new EditorScene(this);
m_view = new EditorView(m_scene);
// ...
}
void EditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) {
printf("B\n");
// ...
}
void EditorView::mouseMoveEvent(QMouseEvent* event) {
printf("C\n");
event->ignore();
}
仅打印“C”。注意EditorScene
and EditorView
接收不同类型的鼠标事件,因此传递它们并不完全是微不足道的。
The EditorWindow
还需要鼠标坐标;目前,我正在从一个孩子那里发送一个信号,该信号被窗户捕捉到......但实际上没有必要以这种方式转发它,不是吗?
找到了这个好文章 http://doc.trolltech.com/qq/qq11-events.html。呼唤ignore()
告诉 Qt 寻找另一个接收器。听起来应该可行,但也许这意味着无关接收者。传播它的正确方法实际上是调用BaseClass::Event
像这样:
void EditorView::mouseMoveEvent(QMouseEvent* event) {
QGraphicsView::mouseMoveEvent(event); // propogate to parent widget
printf("C\n");
}
现在它正在打印 BCBCBC...这很棒,但我似乎无法将其提升一级...
另一个编辑:它was被正确传播,我只是没有setMouseTracking
已启用。
QGraphicsView::mouseMoveEvent(event);
不会向上传播到父级——它实际上向下传播到场景。
发生的事情是这样的——QGraphicsView 接收 QMouseEvent,将其转换为 QGraphicsSceneMouseEvent 并将其传递到场景。然后场景将其传递给适当的项目,或者在您的情况下打印“B”。然后事件处理程序返回到 EditorView 并打印“C”。
然后,如果您显式忽略事件(默认情况下接受鼠标移动),Qt 事件处理程序会将事件传递给 EditorView 的父级。因此,在打印“C”后尝试忽略。
关于鼠标移动的另一件事是:
如果关闭鼠标跟踪,则仅当在移动鼠标时按下鼠标按钮时才会发生鼠标移动事件。如果打开鼠标跟踪,即使没有按下鼠标按钮,也会发生鼠标移动事件。
因此,请确保您在 EditorView 的父级上启用了跟踪(或者按下按钮:))。
编辑:
顺便说一句,EditorScene 不是 EditorView 的父级。好吧,它在您的代码中,但仅在 QObject 的父级含义中(仅限内存管理)。
QGraphicsScene和View没有正常的家庭关系——场景可以有多个视图,而这些视图是不相关父母的子视图。
为了传播窗口事件,您必须有基于 QWidget 的父级。事实上,我很确定您将 EditorView 重新设置为 EditorWindow 或其子级之一(当您将其添加到布局中时)。
立即编辑:
对于坐标,您希望 View 本身发出信号。既是出于解耦的原因,也是因为您可能想显示视图的本地坐标,而不是父窗口的本地坐标,也不是屏幕坐标(对吗?)。如果你确实想要场景坐标,View也是正确的选择,因为它知道变换矩阵。
坐标是这样的:
屏幕 -> EditorWindow 本地 -> EditorView 本地 -> 场景转换 -> 本地转换的任何项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)