gpt4 book ai didi

c++ - Qt——将事件传递给多个对象?

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:22 25 4
gpt4 key购买 nike

我基本上有 3 个层(Window > Scene > View),每个层都需要处理一个 mouseMove 事件而不阻塞其他层。不过,似乎只有最小的 child 才能参加事件。我希望我可以处理该事件,然后调用 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”。请注意,EditorSceneEditorView 接收不同类型的鼠标事件,因此传递它们并非完全微不足道。

EditorWindow 也需要鼠标坐标;目前我正在从一个被 window 挡住的 child 那里发送信号...但实际上没有必要以这种方式传递它,不是吗?


找到这个 nice article .调用 ignore() 告诉 Qt 寻找另一个接收者。听起来应该可以,但它可能意味着一个不相关 接收器。传播它的正确方法实际上是像这样调用 BaseClass::Event:

void EditorView::mouseMoveEvent(QMouseEvent* event) {
QGraphicsView::mouseMoveEvent(event); // propogate to parent widget
printf("C\n");
}

现在它正在打印 BCBCBC...这很棒,但我似乎无法再将其提升一个级别...


另一个编辑:它正确传播,我只是没有启用setMouseTracking

最佳答案

QGraphicsView::mouseMoveEvent(event);

不会向上传播到父级——它实际上向下传播到场景。

事情是这样的——QGraphicsView 接收到 QMouseEvent,将其转换为 QGraphicsSceneMouseEvent 并将其传递给场景。然后 Scene 将其传递给适当的项目,或者在您的情况下打印“B”。然后事件处理程序返回到 EditorView 并打印“C”。

然后,如果您显式忽略事件(默认接受鼠标移动),Qt 事件处理程序会将事件传递给 EditorView 的父级。因此,请在打印“C”后尝试忽略。

关于鼠标移动的另一件事是:

If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved. If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.

因此请确保您在 EditorView 的父级上启用了跟踪(或者您按下按钮 :))。

编辑:顺便说一句,EditorScene 不是 EditorView 的父级。好吧,它在您的代码中,但仅在 QObject 的父级含义中(仅内存管理)。

QGraphicsScene 和 View 没有正常的家庭关系——场景可以有多个 View ,而这些 View 是不相关 parent 的 child 。

出于窗口事件传播的目的,您必须具有基于 QWidget 的父级。事实上,我很确定您将 EditorView 重新设置为 EditorWindow 或其子项之一(当您将其添加到布局中时)。

即时编辑:对于坐标,您希望 View 本身发出信号。既出于解耦的原因,也因为您可能想显示 View 的局部坐标,而不是父窗口的坐标,也不是屏幕坐标(对吗?)。如果你真的想要场景坐标,View 也是正确的选择,因为它知道变换矩阵。

坐标是这样的:Screen -> EditorWindow local -> EditorView local -> Scene transformed -> 本地转换的任何项目。

关于c++ - Qt——将事件传递给多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com