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

2024-03-24

我基本上有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(使用前将#替换为@)

Qt——将事件传递给多个对象? 的相关文章

  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 意外的 const 引用行为

    include
  • 如何释放字符串未使用的容量

    我正在程序中处理很多字符串 这些字符串数据在读入我的程序后的整个生命周期内都不会改变 但由于 C 字符串保留了容量 因此浪费了大量肯定不会被使用的空间 我尝试释放这些空间 但没有成功 以下是我尝试过的简单代码 string temp 123
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac

随机推荐

  • 在 C++ 声明中使用 ^ 字符意味着什么? [复制]

    这个问题在这里已经有答案了 可能的重复 C CLI 中插入符号 是什么意思 https stackoverflow com questions 202463 what does the caret mean in c cli 在 C CLR
  • 为什么我会遇到映射异常?

    我正进入 状态 org hibernate MappingException Foreign key FKBB979BF4266AA123 address a id must have same number of columns as t
  • 如何在android中设置定时器

    在 android 中设置计时器以启动任务 我创建的不会更改 UI 的函数 的正确方法是什么 以 Java 方式使用它 http docs oracle com javase 1 5 0 docs api java util Timer h
  • 应用程序无法使用 libcurl C++ Windows 7 VS 2010 启动(0xc0150002)[重复]

    这个问题在这里已经有答案了 可能的重复 应用程序无法正确初始化 0xc0150002 https stackoverflow com questions 3537429 the application failed to initializ
  • 从 NSMenu 打开 NSWindowController

    我在代理应用程序中使用 NSMenu 坞站中没有图标 当点击此菜单中的按钮时 我想显示一个通用的 NSWindowController 我的菜单按钮操作 IBAction menuButtonTapped id sender MyWindo
  • 如何列出GC终结列表中的所有对象?

    我的程序崩溃了 它是VS的可视化工具 所以 调试它非常困难 我尝试过转储并使用WinDbg来研究它 但没有成功 所以 现在我尝试以编程方式把手放在该列表上 但我不知道如何 谢谢 如果您想查看某个对象是否在终结队列或 f reachable
  • 对 Stripe 的 API 请求失败(错误:不是有效的 URL)

    我想在 Node 应用程序中使用 Stripe 预构建结帐页面构建一个简单的结帐页面 我遵循 Stripe 文档中的所有必要步骤 但 API 请求似乎不起作用 服务器 js const express require express con
  • 针对网站特定部分的移动检测

    我是网络开发的初学者 我很难解决这个问题 我拍摄了一段视频并将其编码为 mp4 文件和 ism 文件 我有两个不同的视频标签 一个将播放每个文件 对于我正在开发的网站 如果在移动设备上查看该网站 我希望它使用其中一个视频标签 如果不是 则使
  • 如何检测系统日期回滚?

    如何检测用户何时回滚系统日期 使用情况是为了防止规避许可 程序需要检测在未运行时发生的回滚 好吧 您可以在程序中使用嵌入式数据库 其中每隔一段时间就会插 入一个加密的系统日期 如果您发现 较新 的日期早于之前的某个日期 则可以看出有人更改了
  • 加快 IIS/.NET/LINQ 从网络缓冲区检索数据的速度

    当对我的 Web 服务器和数据库服务器之间的流量进行 TCP 分析时 我发现网络缓冲区 TCP 窗口 经常被填满 然后 Web 服务器向数据库服务器发送 TCP 消息 告知其缓冲区已满 并且在更新之前不要发送更多数据 例如 这是随着时间的推
  • 如何提高词法分析效率?

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • CMake 和 pybind11 使用不一致的 Python 版本

    我正在 Ubuntu 20 04 上的 VSCode 1 46 1 中使用 CMake 3 16 3 和 pybind11 2 4 3 创建一个入门项目 默认情况下同时包含 Python 2 7 和 3 8 我想为Python3构建一个模块
  • 如何更改 Flutter 中的 Slider 标签颜色?

    Flutter 中可以更改 Slider 标签颜色吗 的构造函数中没有这个字段Slider class 根据 Flutter api 使用 valueIndicatorColor 这是 SliderThemeData 的属性 正如这里提到的
  • 当用户通过后退按钮到达时重新加载页面

    我有一个通用错误页面 任何已处理的错误都会重定向到该页面 我有一个管理页面 当用户调用错误时 用户会被带到错误页面 点击错误页面的后退按钮会导致管理页面加载不正确 所以我需要的是一种当我从错误页面返回时重新加载管理页面的方法 我尝试在管理页
  • 验证 htaccess 重写规则中的 utf-8

    我使用重写规则验证包含 utf 8 字符的 url RewriteRule a z 2 a z0 9 1 256 print 1 256 index php 语言 1 categories 2 get query 3 大 get query
  • VLOOKUP 和插值

    我正在尝试检查表中的特定数据 如果找到该数据 它将显示该数据 我用 VLOOKUP 做到了这一点 但现在如果数据不在表中 我想在两组数据之间进行插值 但我不知道该怎么做 所以我想要实现的是检查表中是否有数字 如果不是则需要进行插值 Exap
  • Android:中心启动屏幕图像

    我有一个带有启动屏幕的应用程序 启动屏幕在小型设备上看起来不错 但在大型平板电脑 模拟器 上看起来很糟糕 所以我把背景改成了wrap content 但它看起来与屏幕的一侧对齐 有人可以告诉我一种将背景图像居中的方法吗 这是我的splash
  • SublimeLinter ESLint 找不到插件

    在 Sublime Text Editor 3 x 中编辑 javascript 文件时 出现错误 Oops Something went wrong ESLint 6 0 1 ESLint couldn t find the plugin
  • 访问验证管道中的请求对象

    我正在尝试访问Request object从一个内Validation Pipe in nestjs 为了验证某些字段的唯一性 我需要ID UUID提供的参数PUT PATCH请求 数据结构本身不可用 任何想法 目前 根本不可能在 a 中访
  • Qt——将事件传递给多个对象?

    我基本上有3层 Window gt Scene gt View 每个人都需要处理一个mouseMove事件不妨碍其他人 不过 似乎只有最小的孩子才能参加该活动 我希望我可以处理该事件然后致电event gt ignore 将事件传递回堆栈