如何在Qt中创建自定义车轮事件

How to create custom wheel events in Qt?

本文关键字:自定义 事件 创建 Qt      更新时间:2023-10-16

我发现了关于自定义QEvents的多个问题。因此,自Qt 4以来,我们必须从QEvent派生并注册我们的自定义类型。这里有一些样品。

我想要的是一个QWheelEvent与自定义数据在它。因此,事件应该在任何地方都可用作为"正常"的QWheelEvent,但如果我想,我可以检查我的CustomWheelEvent类型并从中检索数据。

问题是我不知道如何注册类型,因为QWheelEvent的构造函数不提供设置事件类型的可能性。

查看QEvent的内部,我可以简单地将受保护的成员Type t设置为registerEventType()返回的事件类型。这有副作用吗?

如果我只是从QWheelEvent派生,我也可以使用dynamic_cast来确定它是否是我自己的事件携带我的自定义数据。但是,在检查类型之后进行简单的静态强制转换应该更好。

对此有什么想法吗?


编辑:我已经尝试了dynamic_casts的方法,但cast似乎失败了。如果Qt内部深度复制事件,这是可能的,这样就可以创建一个新的QWheelEvent,并通过事件系统传递,而不是我的CustomWheelEvent。这样,我自己的数据(在CustomWheelEvent中定义)从对象中剥离出来,只处理基类(QWheelEvent)。我最初认为指针是按原样使用的,这样我就可以依靠dynamic_cast。更多的信息,这是赞赏!

阅读以下内容:Qt:定义自定义事件类型

我认为你确实想要注册事件,它将返回一个新的未使用的类型(数字)。在上面的示例中,静态对象将值设置为QEvent::None。我看到的解决方案的主要问题是,它不是线程安全的,所以,一定要使这个线程安全的某种方式(如可能调用静态类型的方法之前,事情开始,以便他们被初始化之前,它可以在多线程的方式使用)。